Dockerfile中的COPY和ADD命令有什么区别?我什么时候可以使用其中一个命令而不是另一个命令?

COPY <src> <dest>

COPY指令将从<src>复制新文件,并将它们添加到路径<dest>的容器文件系统中

ADD <src> <dest>

ADD指令将从<src>复制新文件,并将它们添加到路径<dest>的容器文件系统中。


当前回答

资料来源:https://nickjanetakis.com/blog/docker-tip-2-the-difference-between-copy-and-add-in-a-dockerile:

COPY和ADD都是Dockerfile指令,具有相似的用途。它们允许您将文件从特定位置复制到Docker映像中。COPY接受src和destination。它只允许您将本地文件或目录从主机(构建Docker映像的机器)复制到Docker映像本身。ADD也允许您这样做,但它还支持其他两个源。首先,您可以使用URL而不是本地文件/目录。其次,您可以将tar文件从源文件直接提取到目标文件中ADD的一个有效用例是当您想要将本地tar文件提取到Docker映像中的特定目录中时。如果要将本地文件复制到Docker映像,请始终使用COPY,因为它更显式。

其他回答

ADD指令从本地或远程源复制文件或文件夹,并将其添加到容器的文件系统中。它用来复制本地文件,这些文件必须在工作目录中。ADD指令将本地.tar文件解包到目标映像目录。

实例

ADD http://someserver.com/filename.pdf /var/www/html

COPY从工作目录复制文件并将其添加到容器的文件系统中。无法使用Dockerfile指令的URL复制远程文件。

实例

COPY Gemfile Gemfile.lock ./
COPY ./src/ /var/www/html/

资料来源:https://nickjanetakis.com/blog/docker-tip-2-the-difference-between-copy-and-add-in-a-dockerile:

COPY和ADD都是Dockerfile指令,具有相似的用途。它们允许您将文件从特定位置复制到Docker映像中。COPY接受src和destination。它只允许您将本地文件或目录从主机(构建Docker映像的机器)复制到Docker映像本身。ADD也允许您这样做,但它还支持其他两个源。首先,您可以使用URL而不是本地文件/目录。其次,您可以将tar文件从源文件直接提取到目标文件中ADD的一个有效用例是当您想要将本地tar文件提取到Docker映像中的特定目录中时。如果要将本地文件复制到Docker映像,请始终使用COPY,因为它更显式。

您应该查看ADD和COPY文档,以了解其行为的更详细描述,但简而言之,主要区别在于ADD可以比COPY做得更多:

ADD允许<src>作为URL参考以下评论,ADD文件指出:

如果是公认的压缩格式(标识、gzip、bzip2或xz)的本地tar存档,则将其解压缩为目录。来自远程URL的资源不会解压缩。

注意,编写Dockerfile的最佳实践建议在不需要ADD魔力的地方使用COPY。否则,当您打算将keep_this_archive_intact.tar.gz复制到容器中时,您(因为您必须查找这个答案)可能会感到惊讶,但相反,您将内容喷到文件系统中。

由于Docker 17.05 COPY在多阶段构建中与--from标志一起使用,所以可以将工件从先前的构建阶段复制到当前的构建阶段。

从文档中

可选地,COPY接受一个标志--from=<name|index>,该标志可用于将源位置设置为将使用的前一个生成阶段(使用from..AS创建),而不是用户发送的生成上下文。

从Docker文档:

添加或复制虽然ADD和COPY功能相似,但一般来说,COPY是首选。这是因为它比ADD更透明。COPY仅支持将本地文件基本复制到容器中,而ADD具有一些不明显的功能(如仅本地的tar提取和远程URL支持)。因此,ADD的最佳用途是将本地tar文件自动提取到图像中,如ADD rootfs.tar.xz/中所示。

更多:编写Dockerfile的最佳实践