概述
在 Dockerfile 中,COPY 和 ADD 都是用于将文件/目录从构建上下文(build context)复制到镜像中的指令,但它们在功能上有关键区别:
| 特性 | COPY |
ADD |
|---|---|---|
| 基本功能 | 仅支持本地文件/目录复制 | 额外支持 URL 下载 和 自动解压压缩包 |
| 推荐使用场景 | 大多数情况(更透明、可预测) | 需要下载或解压的场景 |
| 行为复杂度 | 简单直接 | 隐含行为较多(解压可能造成意外效果) |
对比
COPY
只能复制本地文件/目录到镜像:
COPY ./app.py /app/ # 复制本地文件到镜像
ADD
除了支持本地复制,还额外支持解压(仅限本地文件):
ADD dataset.tar.gz /data/ # 复制并自动解压到 /data
然而,对于URL的文件,只下载,不解压:
ADD https://example.com/data.zip /tmp/ # 下载文件(不解压!)
如果需要下载并解压,建议使用RUN命令组合:
RUN curl -o /tmp/data.zip https://example.com/data.zip \
&& unzip /tmp/data.zip \
&& rm /tmp/data.zip # 显式控制更安全
总结
核心原则: 绝大多数情况下都尽量使用 COPY。

