ADD有两种形式:
ADD <src>… <dest>
ADD [“<src>”,… “<dest>”] [这种形式通常用于包含空白字符的路径]
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 –
如果远程URL需要验证,你需要使用RUN wget,RUN curl或容器内的其它工具下载文件,因为ADD指令不支持验证功能。
如果<src>的文件已经更改,那么涉及到这个路径的第一个ADD指令将使Dockerfile后面的所有指令缓存失效。其中RUN指令的缓存也将失效。
ADD遵守如下规则:
<src>路径必须在构建上下文内;你不能ADD ../something /something,因为docker build的第一步已经把上下文目录和子目录发送到docker daemon了。
如果<src>是一个远程URL,且<dest>路径后没有跟斜杠,那么这个文件从远程URL下载并复制到<dest>
如果<src>是一个远程URL,且<dest>路径后有斜杠,那么filename从URL获取并把文件下载到<dest>/<filename>。例如,ADD http://example.com/foobar /将创建文件/foobar。远程URL是包括路径的URL,这样docker才能获取文件名,像http://example.com是不行的。
如果<src>是一个目录,目录的所有内容都将复制,包括文件系统元数据。
注意:不会复制目录本身,只是它的内容。
如果<src>是一个本地的可识别的tar压缩文件[如gzip,bzip2或xz],那么将在容器内解压为目录。远程URL的压缩文件将不会解压。
如果<src>是多个资源,不管是直接指定或使用通配符,那么<dest>必须是一个目录,并且已经以斜杠/结尾。
如果<dest>不以斜杠/结尾,将视其为一个普通文件,<src>的内容将写到这个文件。
如果<dest>不存在,则会与其路径中的所有缺少的目录一起创建。
注意:ADD与COPY唯一的区别就是COPY添加本地压缩文件时不会自动解压到容器。对于其它不需要自动解压文件的情况,你应该始终使用COPY。