在我的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

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


当前回答

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

从文档中可以看到:

<src>路径必须在构建的上下文中;你 不能添加../something/something,因为docker的第一步 构建是将上下文目录(和子目录)发送到 码头工人守护进程。

编辑:现在有一个选项(-f)来设置Dockerfile的路径;你可以用它来达到你想要的,看看@Boedy的回应。

其他回答

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

# docker-compose.yml

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

让设置上下文:../..docker-compose.yml父文件夹中的/ 例:

app:
    build:
      context: ../../
      dockerfile: ./source/docker/dockerfile/Dockerfile

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

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

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

-f foo/bar/Dockerfile foo/bar

而不是

-f foo/bar/Dockerfile .

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

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

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

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

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

从文档中可以看到:

<src>路径必须在构建的上下文中;你 不能添加../something/something,因为docker的第一步 构建是将上下文目录(和子目录)发送到 码头工人守护进程。

编辑:现在有一个选项(-f)来设置Dockerfile的路径;你可以用它来达到你想要的,看看@Boedy的回应。