Dockerfile 中的 `COPY` 和 `ADD` 命令有什么区别?

官方文档中两个命令展示的使用方法:

COPY <src> <dest>
ADD <src> <dest>

看上去都差不多,到底有什么区别呢?

1 个解决方案

AllenJiang
中间件研发,关注微信公众号 : 小哈学Java, 回复"666", 即可免费领取10G学习&面试资料

简而言之,可以理解如下:

那么,ADD 更高级的复制文件体现在哪儿呢?相对于 COPY, ADD 添加了以下两个新特性:

  • 1.ADD 允许 <src> 是一个 URL

  • 2.如果 <src> 参数是 ADD 可识别的压缩格的文件的话,则将自动解压缩

总结

在 Docker 官方的 Dockerfile 最佳实践文档 中要求,尽可能的使用 COPY,因为 COPY 的语义很明确,就是复制文件而已,而 ADD 则包含了更复杂的功能,其行为也不一定很清晰。最适合使用 ADD 的场合,就是所提及的需要自动解压缩的场合。

另外需要注意的是,ADD 指令会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。

因此在 COPY 和 ADD 指令中选择的时候,可以遵循这样的原则,所有的文件复制均使用 COPY 指令,仅在需要自动解压缩的场合使用 ADD。