Linux入门教程:Dockerfile参考(11) – ADD COPY添加文件和目录到镜像, 可以指定多个

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 – < somefile],那么就没有构建上下文,所以Dockerfile中的ADD指令的<src>只能是远程URL。你也可以通过标准输入传递一个压缩文件:(docker build - < archive.tar.gz),在这个压缩文件根目录的Dockerfile和压缩文件的其它文件将作为构建的上下文使用。

如果远程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。

相关内容