Dockerfile参考(11) – ADD COPY添加文件和目录到镜像

ADD有两种形式:

  • ADD <src>… <dest>
  • ADD [“<src>”,… “<dest>”] [这种形式通常用于包含空白字符的路径]
  • ADD指令从<src>复制新的文件,目录或远程文件URLs并添加到镜像文件系统的<dest>路径。
    可以指定多个<src>资源,这些资源必须是相对于正在构建的源目录(构建的上下文)。
    每个<src>可以包含通配符并且使用Go的filepath.Match规则匹配。例如:

    1. ADD hom* /mydir/        # adds all files starting with "hom"
    2. ADD hom?.txt /mydir/    # ? is replaced with any single character, e.g., "home.txt"

    <dest>是一个绝对路径,或者是WORKDIR的相对路径。

    1. ADD test relativeDir/          # adds "test" to `WORKDIR`/relativeDir/
    2. 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。

    标签:Docker 发布于:2019-11-19 22:04:35