Dockerfile文件的 ADD src dest ,src表示的文件或目录只能跟Dockerfile文件在同一目录吗?


ADD

格式为 ADD <src> <dest> 。

该命令将复制指定的 <src> 到容器中的 <dest> 。 其中 <src> 可以是Dockerfile所在目录的一个相对路径;也可以是一个URL;还可以是一个tar文件(自动解压为目录)。则。

COPY

格式为 COPY <src> <dest> 。

复制本地主机的 <src> (为Dockerfile所在目录的相对路径)到容器中的 <dest>

从上面的定义中可获知,src可以是Dockerfile所在目录的一个相对路径,但在实际操作中,只有与Dockerfile文件在同一目录的文件或目录可以成功的使用ADD <src> <dest>,如:(ADD ./test /data/code/nginx)

如果文件或目录不与Dockerfile在同一目录会提示 no such file or directory,如:(ADD ../test2 /data/code/nginx),从Dockerfile所在目录通过 cd ../test2可以到达test2

与Dockerfile不在同一目录的文件怎么使用ADD命令?
已邀请:

9lives - 爱生活,爱云计算。

赞同来自: darker


借此分享一下,在之前使用Dockerfile 中的ADD 命令中的一个坑。
&amp;amp;amp;lt;strong&amp;amp;amp;gt;场景:&amp;amp;amp;lt;/strong&amp;amp;amp;gt;
需要用sed命令替换掉模版Dockerfile中的某些命令来动态生成Dockerfile来build docker image。
模板文件中用到了ADD 指令,并且src 和 dest都是绝对路径。eg: ADD /tmp/test.txt /tmp/test.txt

&amp;amp;amp;lt;strong&amp;amp;amp;gt;方法:&amp;amp;amp;lt;/strong&amp;amp;amp;gt;
使用sed s/old/new/ Dockerfile_template | docker build -t myimage -

&amp;amp;amp;lt;strong&amp;amp;amp;gt;遇到的问题:&amp;amp;amp;lt;/strong&amp;amp;amp;gt;
/tmp/test.txt 并没有被加入到image里去!

&amp;amp;amp;lt;strong&amp;amp;amp;gt;原因解释:&amp;amp;amp;lt;/strong&amp;amp;amp;gt;
查看官网Dockerfile reference才知,ADD指令需要一个build上下文环境支持,如果用STDIN作为docker build的输入,那么ADD 指令中的 src 参数必须使用url格式的才可以。或者用传入压缩文件的形式提供build上下文。
像这样:

&amp;amp;amp;lt;pre&amp;amp;amp;gt;docker build - &amp;amp;amp;amp;amp;amp;amp;amp;lt; archive.tar.gz&amp;amp;amp;lt;/pre&amp;amp;amp;gt;

最后附上官网解释:
Note: If you build by passing a Dockerfile through STDIN (docker build - &amp;amp;amp;amp;amp;amp;amp;amp;lt; somefile), there is no build context, so the Dockerfile can only contain a URL based ADD instruction. You can also pass a compressed archive through STDIN: (docker build - &amp;amp;amp;amp;amp;amp;amp;amp;lt; archive.tar.gz), the Dockerfile at the root of the archive and the rest of the archive will get used at the context of the build.
如有理解不正确的地方,欢迎大家指正和讨论。

寻觅神迹 - 华为工程师。专注云计算和美食。

赞同来自:


ln建立根目录的link?不知道可以不。

chennanfei

赞同来自:


不需要在同一目录,比如docker build -t test-image:latest -f /src/build/Dockerfile /src
Dockerfile必须在context即“/src:目录或其子目录。假如/src有两个目录build和code,Dockerfile在/src/build下,你要把code目录加进去,在Dockerfile里就可以写&amp;amp;amp;amp;amp;amp;quot;ADD code /code&amp;amp;amp;amp;amp;amp;quot;

要回复问题请先登录注册