在我的Dockerfile我有:

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

该文件以ls ../../myapp的形式存在。war返回我正确的文件,但当我执行sudo docker构建-t myapp。我有:

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

有人知道为什么和如何正确地做吗?


当前回答

改为CD到父目录 从父目录构建映像,指定Dockerfile的路径

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

在这种情况下,docker的上下文将切换到父目录,供ADD和COPY访问

其他回答

对于那些使用composer的人来说,解决方案是使用指向父文件夹的卷:

#docker-composer.yml

foo:
  build: foo
  volumes:
    - ./:/src/:ro

但是我很确定可以在Dockerfile中处理卷。

由于-f引起了另一个问题,我开发了另一个解决方案。

在父文件夹中创建一个基本映像 添加所需文件。 使用此图像作为子代文件夹中项目的基本图像。

-f标志并没有解决我的问题,因为我的onbuild映像在一个文件夹中寻找一个文件,并且必须像这样调用:

-f foo/bar/Dockerfile foo/bar

而不是

-f foo/bar/Dockerfile .

还要注意,这只是在某些情况下使用-f标志的解决方案

假设你有这样的目录树:

dir0
├───dir1
│   └───dir11
|   |   └───dockerfile
|   └───dir12 (current)
└───dir2 (content to be copied)

你的dockerfile是这样的:

FROM baseImage
COPY / /content

假设您想要使用dir11中的dockerfile的copy或ADD将dir2内容复制到一个新的docker映像中,而您的当前目录是dir12

你必须运行这个命令,以正确地构建你的映像:

docker build -t image-name:tag -f ../dir11/dockerfile ../../dir2

-t your-image-name名称和可选的' Name:tag'格式的标签 - f . ./dir11/dockerfile dockerfile名称(默认为'PATH/ dockerfile ') . . / . .COPY或ADD命令的当前路径为/dir2

更新

假设你错误地运行了这个:

docker build -t image-name:tag -f ../dir11/dockerfile ../../

这并不能解决你的问题,因为在这种情况下COPY / /内容看起来就像在复制dir0内容(dir1 & dir2),所以为了解决这个问题,你可以使用正确的路径更改命令,或者你也可以像这样更改dockerfile中的COPY源路径:

COPY /dir2 /content

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

# docker-compose.yml

version: '3.3'    
services:
  yourservice:
    build:
      context: ./
      dockerfile: ./docker/yourservice/Dockerfile

改为CD到父目录 从父目录构建映像,指定Dockerfile的路径

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

在这种情况下,docker的上下文将切换到父目录,供ADD和COPY访问