Dockerfile 中的“COPY”和“ADD”命令有什么区别?
在创建 Dockerfile 时,您可以使用两种不同的命令来构建您的上下文。构建上下文意味着包含您希望从本地机器中获取的文件和目录,以便在创建容器时将其包含在容器中。这些文件可能是您本地机器中的目录,您想要从中下载文件的 URL,或者您想要按原样包含或解压缩后包含的压缩 tarball 文件。
我们可以使用两个不同的指令将本地机器构建上下文中的文件添加到 Docker 容器中。这些指令是 COPY 和 ADD 指令。尽管它们执行几乎相同的任务,但它们的工作方式略有不同。因此,这里的问题是我们为什么需要两个不同的命令来执行相同的工作,以及我们应该使用哪一个?
在本文中,我们将讨论相同的内容。因此,事不宜迟,让我们讨论 ADD 和 COPY 指令的用例。
ADD 指令
我们在 Dockerfile 中使用的 ADD 指令是一个比较旧的指令,从 Docker 的诞生之初就存在。ADD 指令的功能不仅仅是从本地主机复制目录或文件。我们可以使用 ADD 指令从外部链接/URL(如 Github、Bitbucket 等)拉取文件或目录。ADD 指令还可以用于解压缩诸如存档或 tarball 文件之类的压缩文件。但是,如果您实际上不想提取存档,有时可能会导致问题。
ADD 指令的语法为 -
$ ADD <source path> <destination path>
ADD 指令的一些重要用例包括 -
- 将文件和目录从本地机器复制到镜像。
例如,如果我们想简单地将本地主机系统中 /home/user/Dekstop/app 目录中的文件复制到 Docker 镜像中的 /app 目录,我们可以将此指令嵌入到 Dockerfile 中 -
$ ADD /home/user/Desktop/app /app
在这种情况下,守护程序仅将源目录的内容复制到目标目录,包括元数据。由于我们没有提到尾随斜杠,因此它不会复制目录本身。
- 解压缩本地存储的 tarball 文件。
ADD 指令还可以用于解压缩具有以下格式的压缩 tarball 文件或存档 - bzip2、xz、gzip2。ADD 指令会自动将内容提取到 Docker 容器中目标文件夹内创建的目录中。例如,如果我们想将 sample.tar.gz 文件提取到容器内的 /app 目录,我们可以使用以下命令。
$ ADD /home/user/sample.tar.gz /app
这与我们在主机机器中使用 tarball 命令解压缩 tarball 的操作完全相同。
- 从 URL 下载目录或文件
ADD 指令的此功能类似于 wget -P 命令的工作原理。当我们尝试构建 Docker 镜像时,可以使用 ADD 指令直接从给定的 URL 下载文件并将其存储在容器内的某个位置。执行此操作的命令为 -
$ ADD https://www.asamplelink.com/test/sampledocuments/mysamplefile.pdf /app
构建镜像完成后,在启动容器时可以访问这些文件。
COPY 指令
我们可以将 Dockerfile 中的 COPY 指令视为 ADD 指令的演进版本。创建 COPY 指令是为了消除 Docker 开发人员之间的混淆。COPY 指令的唯一功能是从主机机器上的源目录复制文件到容器上的目标目录。如果我们将源指定为 tarball 文件,它不会在容器内解压缩它,而是按原样复制它。
此外,COPY 指令不接受 URL 参数作为源。使用 COPY 指令复制文件的语法为 -
$ COPY <source> <destination>
示例 -
$ COPY /home/user/sample/files /app
最终想法!
总之,如果您希望简单地将文件和目录从本地主机复制到容器环境,建议您仅使用 COPY 指令。您必须尽可能避免使用 ADD 指令。如果要提取或下载文件,可以使用 RUN 指令以及正常的 Linux 命令。
在本文中,我们讨论了如何使用 ADD 和 COPY Dockerfile 指令、它们的用例、两者之间的根本区别以及一些动手示例和命令。
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP