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

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


当前回答

使用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

添加一些代码片段来支持接受的答案。

目录结构:

setup/
 |__docker/DockerFile
 |__target/scripts/<myscripts.sh>
src/
 |__<my source files>

Docker文件入口:

RUN mkdir -p /home/vagrant/dockerws/chatServerInstaller/scripts/
RUN mkdir -p /home/vagrant/dockerws/chatServerInstaller/src/
WORKDIR /home/vagrant/dockerws/chatServerInstaller

#Copy all the required files from host's file system to the container file system.
COPY setup/target/scripts/install_x.sh scripts/
COPY setup/target/scripts/install_y.sh scripts/
COPY src/ src/

用于构建docker映像的命令

docker build -t test:latest -f setup/docker/Dockerfile .

从上目录构建img 命名为img 启用适当的卷共享 查看上面链接中的Makefile,了解如何启动容器… Docker构建。-t proj-devops-img——no-cache——build-arg UID=$(shell id -u)——build-arg GID=$(shell id -g) -f src/docker/devops/Dockerfile . t

假设你有这样的目录树:

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

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

从文档中可以看到:

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

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