
COPY 和 ADD 都是 Dockerfile 中的指令,有着类似的作用。它们允许我们将文件从特定位置复制到 Docker 镜像中。
COPY
COPY 指令从 <src> 复制新的文件或目录,并将它们添加到 Docker 容器文件系统的 <dest> 的路径下。
COPY 有两种格式:
COPY [--chown=<user>:<group>] <src>... <dest>COPY [--chown=<user>:<group>] ["<src>",... "<dest>"](包含空格的路径使用这种格式)
ADD
ADD 有两种格式:
ADD [--chown=<user>:<group>] <src>... <dest>ADD [--chown=<user>:<group>] ["<src>",... "<dest>"](包含空格的路径使用这种格式)
从 URL 复制的 Dockerfile 最佳实践
通过 URL 进行复制的效率通常很低,最佳实践是使用其他策略来包含所需的远程文件。
COPY 只支持基础的复制:将本地文件复制到容器中。
而 ADD 有一些额外的功能 :
- ADD 指令可以让你使用 URL 作为
<src>参数。当遇到 URL 时候,可以通过 URL 下载文件并且复制到<dest>。 - ADD 的另一个特性是自动解压文件的能力。如果
<src>参数是一个可识别压缩格式(tar, gzip, bzip2, …)的本地文件(注:无法实现同时下载并解压),就会被解压到指定容器文件系统的路径<dest>下。
因此,ADD 的最佳用途是将本地压缩包文件自动提取到镜像中:
1 | ADD code.tar.gz /app/ |
由于镜像的体积很重要,所以强烈建议不要使用 ADD 从远程 URL 获取文件,我们应该使用 curl 或 wget 来代替。这样我们可以在解压后删除这些不再需要的文件,同时还也可以避免在镜像中生成额外的层。
我们应该避免以下操作:
1 | ADD http://example.com/big.tar.xz /usr/src/things/ |
这个压缩包解压后,rm 命令处于独立的镜像层。
我们可以这样做:
1 | RUN mkdir -p /usr/src/things \ |
curl 会下载这个压缩包并通过管道传给 tar 命令进行解压,这样也就不会在文件系统中留下这个压缩文件了。
对于不需要自动解压的文件或目录,应该始终使用 COPY。
最后,认准一个原则:总是使用 COPY(除非我们明确需要 ADD)。