github编辑

ADD 更高级的复制文件

基本语法

ADD [选项] <源路径>... <目标路径>
ADD [选项] ["<源路径>", ... "<目标路径>"]

ADDCOPY 基础上增加了两个功能:

  1. 自动解压 tar 压缩包

  2. 支持从 URL 下载文件(不推荐)


ADD vs COPY

特性
COPY
ADD

复制本地文件

自动解压 tar

支持 URL

✅(不推荐)

行为可预测性

✅ 高

⚠️ 低

推荐程度

优先使用

仅解压场景

笔者建议:除非需要自动解压 tar 文件,否则始终使用 COPY。明确的行为比隐式的魔法更好。


自动解压功能

基本用法

ADD 会识别并解压以下格式:

  • .tar

  • .tar.gz / .tgz

  • .tar.bz2 / .tbz2

  • .tar.xz / .txz

实际应用

官方基础镜像通常使用 ADD 解压根文件系统:

解压过程


URL 下载功能(不推荐)

基本用法

为什么不推荐

问题
说明

权限固定

下载的文件权限为 600,通常需要额外 RUN 修改

不会解压

URL 下载的压缩包不会自动解压

缓存问题

URL 内容变化时不会重新下载

层数增加

需要额外 RUN 清理

推荐替代方案

优势:

  • 一条 RUN 完成下载、解压、清理

  • 减少镜像层数

  • 更清晰的构建意图


修改文件所有者


何时使用 ADD

✅ 适合使用 ADD

❌ 不适合使用 ADD


缓存行为

ADD 可能导致构建缓存失效:

优化建议


最佳实践

1. 默认使用 COPY

2. 仅在需要解压时使用 ADD

3. 不要用 ADD 下载文件

4. 解压后清理


本章小结

场景
推荐指令

复制普通文件

COPY

复制目录

COPY

自动解压 tar

ADD

从 URL 下载

RUN curl

保持 tar 不解压

COPY

延伸阅读

最后更新于