Dockerfile之ADD

本文将介绍Dockerfile的ADD指令,ADD 指令和 COPY 的格式和性质基本一致。但是在 COPY 基础上增加了一些功,ADD会对压缩文件进行解压操作。

将主机的文件复制到镜像中,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/
游手好闲地学习,并不比学习游手好闲好。 —— 约翰·贝勒斯
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号