将主机的文件复制到镜像中,ADD会对压缩文件(tar, gzip, bzip2, etc)做提取和解压操作。格式:
ADD <src> <dest>
其中:
<src>:是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是一个远程的文件url。
<dest>:是container中的绝对路径。
ADD 指令和 COPY指令的格式和性质基本一致。但是在 COPY 基础上增加了一些功能。
如果 <src> 为一个 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,ADD 指令将会自动解压缩这个压缩文件到 <dest> 去;
如果 <src> 为一个 URL 地址,则直接下载到 <dest> 中去;
在某些情况下,这个自动解压缩的功能非常有用,比如官方镜像 ubuntu 中:
FROM scratch # 将 ubuntu-bionic-core-cloudimg-amd64-root.tar.gz 文件拷贝且解压到镜像的根目录下面 ADD ubuntu-bionic-core-cloudimg-amd64-root.tar.gz / # verify that the APT lists files do not exist RUN [ -z "$(apt-get indextargets)" ] # (see https://bugs.launchpad.net/cloud-images/+bug/1699913) ...more... RUN mkdir -p /run/systemd && echo 'docker' > /run/systemd/container # overwrite this with 'CMD []' in a dependent Dockerfile CMD ["/bin/bash"]
但在某些情况下,如果我们真的是希望复制个压缩文件进去,而不解压缩,这时就不可以使用 ADD 命令了(使用COPY指令)。
在 Docker 官方的 Dockerfile 最佳实践文档 中要求,尽可能的使用 COPY,因为 COPY 的语义很明确,就是复制文件而已,而 ADD 则包含了更复杂的功能,其行为也不一定很清晰。最适合使用 ADD 的场合,就是所提及的需要自动解压缩的场合。
另外需要注意的是,ADD 指令会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。
因此在 COPY 和 ADD 指令中选择的时候,可以遵循这样的原则,所有的文件复制均使用 COPY 指令,仅在需要自动解压缩的场合使用 ADD。
在使用该指令的时候还可以加上 --chown=<user>:<group> 选项来改变文件的所属用户及所属组。
ADD --chown=55:mygroup files* /mydir/ ADD --chown=bin files* /mydir/ ADD --chown=1 files* /mydir/ ADD --chown=10:11 files* /mydir/