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

COPY <src> <dest>

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

ADD <src> <dest>

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


当前回答

如果您有foo.tar.gz文件,请比较以下命令。ADD命令创建的层比COPY命令少,并且在推送docker图像时节省了大量的网络流量。

ADD foo.tar.gz /
COPY foo.tar.gz /
RUN tar -zxvf foo.tar.gz
RUN rm -rf foo.tar.gz

其他回答

资料来源: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”相同,但没有tar和远程URL处理。

直接从源代码引用。

如果要将xx.tar.gz添加到/usr/local-in容器中,请解压缩它,然后删除无用的压缩包。

副本:

COPY resources/jdk-7u79-linux-x64.tar.gz /tmp/
RUN tar -zxvf /tmp/jdk-7u79-linux-x64.tar.gz -C /usr/local
RUN rm /tmp/jdk-7u79-linux-x64.tar.gz

对于ADD:

ADD resources/jdk-7u79-linux-x64.tar.gz /usr/local/

ADD仅支持本地焦油提取。除此之外,COPY将使用三层,但ADD仅使用一层。

如果您有foo.tar.gz文件,请比较以下命令。ADD命令创建的层比COPY命令少,并且在推送docker图像时节省了大量的网络流量。

ADD foo.tar.gz /
COPY foo.tar.gz /
RUN tar -zxvf foo.tar.gz
RUN rm -rf foo.tar.gz

从Docker文档:https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#add-或复制

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

如果您有多个Dockerfile步骤使用上下文中不同的文件,请单独复制它们,而不是一次复制所有文件。这将确保只有在特定需要的文件发生更改时,每个步骤的构建缓存才会失效(强制重新运行该步骤)。

例如:

 COPY requirements.txt /tmp/
 RUN pip install --requirement /tmp/requirements.txt
 COPY . /tmp/

与放置COPY相比,RUN步骤的缓存无效次数更少/tmp/之前。

因为图像大小很重要,所以强烈不建议使用ADD从远程URL获取包;您应该改用curl或wget。这样,您就可以删除提取后不再需要的文件,并且不必在图像中添加另一层。例如,您应该避免做以下事情:

 ADD http://example.com/big.tar.xz /usr/src/things/
 RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things
 RUN make -C /usr/src/things all

相反,请执行以下操作:

 RUN mkdir -p /usr/src/things \
     && curl -SL htt,p://example.com/big.tar.xz \
     | tar -xJC /usr/src/things \
     && make -C /usr/src/things all

对于不需要ADD的tar自动提取功能的其他项目(文件、目录),您应该始终使用COPY。"