Docker:从父目录添加文件


182

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

有人知道为什么以及如何正确进行吗?


Answers:


223

您可以从父目录构建Dockerfile:

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

3
谢谢!这在本地机器上可以正常工作,但是Docker Hub无法构建映像,因为它尝试从同一目录(tbh,通常是人们期望的目录)来执行该映像。有什么方法可以在Docker Hub中做同样的事情?
马塞尔·埃尔南德斯

从来没听说过。您可以将映像推送到注册表,而不是使用自动生成。
Boedy'3

2
@ eduncan911我认为在撰写评论时不建议弃用。从那以后他们可能会改变主意?如果我写错了,可以链接到说明它已被弃用的文档吗?谢谢!
omn​​inonsense

6
-f 似乎并未按照文档弃用-> 指定Dockerfile(-f)docs.docker.com/engine/reference/commandline/build/…–
Ray

6
@ eduncan911您是否可以删除您的评论,因为它显然已被弃用?最初由于您的评论,我跳过了这个答案。
克里斯·安德森

103

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

文档中

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

编辑:现在有一个选项(-f)来设置Dockerfile的路径;它可以用来实现您想要的功能,请参阅下面的@Boedy响应。


22
是否有“干净”的解决方法?我宁愿不要为了适应此目的而重新构建整个项目目录。
ben_frankly 2014年

就像@Günter所说的那样,这里有一种解决方法superuser.com/a/842690/136024 ...真的“干净”吗?好吧,至少这是一个“解决方法” :)
Anthony O.



9

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

目录结构:

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 .

好方法。是否可以共享的代码install_x.sh
Ariful Haque

4

对于那些谁使用作曲家的解决方案是使用一个体积指向父文件夹:

#docker-composer.yml

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

但是我很确定可以完成Dockerfile中的卷的播放


3
不行 注意:主机目录本质上是依赖主机的。因此,您不能从Dockerfile挂载主机目录,因为构建的映像应该是可移植的。主机目录并非在所有潜在主机上都可用。docs.docker.com/engine/tutorials/dockervolumes/...
Peeter Kokk

4

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

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

-f标志不能解决我的问题,因为我的onbuild图像在文件夹中查找文件,并且必须这样调用:

-f foo/bar/Dockerfile foo/bar

代替

-f foo/bar/Dockerfile .

另请注意,这仅在某些情况下作为-f标志的解决方案

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.