ADD有两种形式:
ADD指令从<src>复制新的文件,目录或远程文件URLs并添加到镜像文件系统的<dest>路径。
可以指定多个<src>资源,这些资源必须是相对于正在构建的源目录(构建的上下文)。
每个<src>可以包含通配符并且使用Go的filepath.Match规则匹配。例如:
- ADD hom* /mydir/ # adds all files starting with "hom"
- ADD hom?.txt /mydir/ # ? is replaced with any single character, e.g., "home.txt"
<dest>是一个绝对路径,或者是WORKDIR的相对路径。
- ADD test relativeDir/ # adds "test" to `WORKDIR`/relativeDir/
- ADD test /absoluteDir/ # adds "test" to /absoluteDir/
所有新创建的文件和目录的UID和GID都是0.
当<src>为一个远程文件URL时,新创建的文件和目录权限为600。如果获取的远程文件的HTTP有一个Last-Modified响应头,那么这个响应头的时间戳将设置为新创建的文件和目录的mtime。不过,在ADD期间像其它任意文件的处理过程中,mtime不能决定文件是否已经更改和缓存是否应该更新。
注意:如果通过标准输入传递Dockerfile构建镜像[docker build – < somefile],那么就没有构建上下文,所以Dockerfile中的ADD指令的<src>只能是远程URL。你也可以通过标准输入传递一个压缩文件:(docker build – < archive.tar.gz),在这个压缩文件根目录的Dockerfile和压缩文件的其它文件将作为构建的上下文使用。
如果远程URL需要验证,你需要使用RUN wget,RUN curl或容器内的其它工具下载文件,因为ADD指令不支持验证功能。
如果<src>的文件已经更改,那么涉及到这个路径的第一个ADD指令将使Dockerfile后面的所有指令缓存失效。其中RUN指令的缓存也将失效。
ADD遵守如下规则:
注意:不会复制目录本身,只是它的内容。
注意:ADD与COPY唯一的区别就是COPY添加本地压缩文件时不会自动解压到容器。对于其它不需要自动解压文件的情况,你应该始终使用COPY。