Docker:从父目录添加一个文件

在我的Dockerfile有:

 ADD ../../myapp.war /opt/tomcat7/webapps/ 

该文件存在为ls ../../myapp.war返回正确的文件,但是当我执行sudo docker build -t myapp . 我有 :

 Step 1 : ADD ../../myapp.war /opt/tomcat7/webapps/ 2014/07/02 19:18:09 ../../myapp.war: no such file or directory 

有人知道为什么以及如何正确地做到这一点?

不幸的是,(为了实际和安全的原因,我猜),如果你想添加/复制本地内容,它必须位于与Dockerfile相同的根path下。

从文档 :

<src>path必须位于构build的上下文中; 你不能添加../something /东西,因为docker build的第一步是将上下文目录(和子目录)发送到docker守护进程。

编辑:现在有一个选项( -f )来设置您的Dockerfile的path; 它可以用来实现你想要的,看到@Boedy的反应就是这样。

您可以从父目录构buildDockerfile:

 docker build -t <some tag> -f <dir/dir/Dockerfile> . 

使用docker-compose你可以设置上下文文件夹:

 #docker-compose.yml version: '3.3' services: yourservice: build: context: ./ dockerfile: ./docker/yourservice/Dockerfile 

那些使用composer php的解决scheme是使用指向父文件夹的卷:

 #docker-composer.yml foo: build: foo volumes: - ./:/src/:ro 

但我很确定可以在Dockerfile中使用卷来完成。

由于-f导致另一个问题,我开发了另一个解决scheme。

  • 在父文件夹中创build一个基础图像
  • 添加了所需的文件。
  • 将此图像用作后代文件夹中的项目的基础图像。

-f标志没有解决我的问题,因为我的onbuild图像在文件夹中查找文件,不得不像这样调用:

-f foo/bar/Dockerfile foo/bar

代替

-f foo/bar/Dockerfile .

另外请注意,这只是解决某些情况下的-f标志