📜  Dockerfile 中 COPY 和 ADD 命令的区别

📅  最后修改于: 2021-09-14 01:17:01             🧑  作者: Mango

介绍 :
创建 Dockerfile 时,通常需要将文件从主机系统传输到 Docker 映像中。这些可能是我们的应用程序在运行时需要的属性文件、本机库或其他静态内容。

Dockerfile 规范提供了两种将文件从源系统复制到映像的方法: COPY 和 ADD 指令。
在本文中,我们将看看它们之间的区别以及何时使用它们是有意义的。
有时您会在 Dockerfile 中看到 COPY 或 ADD 被使用,但 99% 的情况下您应该使用 COPY。这是为什么?
COPYADD都是用于类似目的的 Dockerfile 指令。它们允许您将文件从特定位置复制到 Docker 映像中。
COPY接受 src 和破坏。它只允许您将主机(构建 Docker 映像的机器)的本地或目录复制到 Docker 映像本身。

COPY  

ADD 也允许您这样做,但它也支持 2 个其他来源。首先,您可以使用 URL 而不是本地文件/目录。其次,您可以将源目录中的 tar 提取到目标目录中。

ADD  

在大多数情况下,如果您使用 URL,则下载一个 zip 文件,然后使用RUN命令将其解压缩。但是,您也可以在此处使用 RUNcurl而不是ADD ,因此您将所有内容链接到 1 个RUN命令中以制作更小的 Docker 映像。
ADD 的一个有效用例是当您想要将本地 tar 文件提取到 Docker 映像中的特定目录中时。这正是 Alpine 映像使用ADD rootfs.tar.gz / 所做的。
如果要将本地文件复制到 Docker 映像,请始终使用COPY,因为它更明确。

虽然功能相似,但 ADD 指令在两个方面更强大:

  • 它可以处理远程 URL
  • 它还可以自动提取 tar 文件。

让我们更仔细地看看这些。
首先,ADD 指令可以接受远程 URL 作为其源参数。另一方面,COPY 指令只能接受本地文件。
请注意,使用 ADD 获取远程文件和复制通常并不理想。
这是因为该文件会增加整体 Docker 映像的大小。相反,我们应该使用curlwget来获取远程文件并在不再需要时将其删除。
其次, ADD 指令会自动将 tar 文件扩展到映像文件系统中。虽然这可以减少构建映像所需的 Dockerfile 步骤数量,但并非在所有情况下都需要。
请注意,自动扩展仅在源文件位于主机系统本地时发生。

何时使用 ADD 或 COPY :
根据 Dockerfile 最佳实践指南,除非我们特别需要 ADD 的两个附加功能之一,否则我们应该始终更喜欢 COPY 而不是 ADD。
如上所述,使用 ADD 命令会自动扩展 tar 文件和某些压缩格式,这可能导致意外的文件被写入我们图像中的文件系统。

结论 :
在本文中,您已经了解了将文件复制到 Docker 映像的两种主要方法:ADD 和 COPY。虽然功能相似,但 COPY 指令在大多数情况下是首选。这是因为 ADD 指令提供了应谨慎使用且仅在需要时使用的附加功能。