1. 概述
在创建Dockerfile时,经常需要将主机系统中的文件复制到Docker镜像中。这些可能是属性文件、原生库或其他运行时应用程序所需的静态内容。
Dockerfile规范提供了两种将文件从源系统复制到镜像的方法:COPY
和 ADD
指令。
本文将探讨它们之间的差异,并在何时使用每种方法是有意义的。
2. COPY
与ADD
的区别
乍一看,COPY
和ADD
指令看起来相同。它们具有相同的语法:
并且两者都将文件从主机系统复制到Docker镜像。
那么,它们有什么不同呢? 简而言之,ADD
指令比COPY
更强大。
尽管功能相似,但ADD
指令在两个方面更具优势:
- 它可以处理远程URL
- 它可以自动解压缩tar文件
让我们更仔细地看看这些特性。
首先,ADD
指令可以接受远程URL作为其source
参数。而COPY
指令只能接受本地文件。
请注意,在ADD
指令中获取远程文件并进行复制通常并不理想。这是因为文件会增加Docker镜像的整体大小。相反,我们应该使用curl或wget来获取远程文件,并在不再需要时删除它们。
其次,**ADD
指令会自动将tar文件扩展到镜像文件系统**。虽然这可以在构建镜像所需步骤的数量上减少,但在所有情况下可能并不是最佳选择。
值得注意的是,自动展开仅在源文件位于主机系统本地时发生。
3. 使用ADD
或COPY
根据Dockerfile最佳实践指南,除非我们特别需要ADD
的两个额外功能之一,否则我们应该始终优先使用COPY
而不是ADD
。
如上所述,使用ADD
将远程文件复制到Docker镜像中会增加额外的层次结构并增加文件大小。如果我们使用wget
或curl
代替,可以在不再需要时删除文件,它们不会成为Docker镜像的一部分。
此外,由于ADD
命令自动展开tar文件和某些压缩格式,它可能导致意外文件被写入我们的镜像中的文件系统。
4. 总结
在这篇快速教程中,我们看到了将文件复制到Docker镜像的两种主要方式:ADD
和COPY
。虽然功能类似,但在大多数情况下,COPY
指令是首选。这是因为ADD
指令提供了应谨慎使用且仅在需要时使用的额外功能。