1. 概述

在创建Dockerfile时,经常需要将主机系统中的文件复制到Docker镜像中。这些可能是属性文件、原生库或其他运行时应用程序所需的静态内容。

Dockerfile规范提供了两种将文件从源系统复制到镜像的方法:COPYADD指令。

本文将探讨它们之间的差异,并在何时使用每种方法是有意义的。

2. COPYADD的区别

乍一看,COPYADD指令看起来相同。它们具有相同的语法:

d902d176-936d-4413-a918-ce7f572b4190

并且两者都将文件从主机系统复制到Docker镜像

那么,它们有什么不同呢? 简而言之,ADD指令比COPY更强大。

尽管功能相似,但ADD指令在两个方面更具优势:

  • 它可以处理远程URL
  • 它可以自动解压缩tar文件

让我们更仔细地看看这些特性。

首先,ADD指令可以接受远程URL作为其source参数。而COPY指令只能接受本地文件。

请注意,在ADD指令中获取远程文件并进行复制通常并不理想。这是因为文件会增加Docker镜像的整体大小。相反,我们应该使用curlwget来获取远程文件,并在不再需要时删除它们。

其次,**ADD指令会自动将tar文件扩展到镜像文件系统**。虽然这可以在构建镜像所需步骤的数量上减少,但在所有情况下可能并不是最佳选择。

值得注意的是,自动展开仅在源文件位于主机系统本地时发生。

3. 使用ADDCOPY

根据Dockerfile最佳实践指南,除非我们特别需要ADD的两个额外功能之一,否则我们应该始终优先使用COPY而不是ADD

如上所述,使用ADD将远程文件复制到Docker镜像中会增加额外的层次结构并增加文件大小。如果我们使用wgetcurl代替,可以在不再需要时删除文件,它们不会成为Docker镜像的一部分。

此外,由于ADD命令自动展开tar文件和某些压缩格式,它可能导致意外文件被写入我们的镜像中的文件系统。

4. 总结

在这篇快速教程中,我们看到了将文件复制到Docker镜像的两种主要方式:ADDCOPY。虽然功能类似,但在大多数情况下,COPY指令是首选。这是因为ADD指令提供了应谨慎使用且仅在需要时使用的额外功能。