dockerfile add vs copy

在 Dockerfile 中,ADD 指令用于将文件或目录从构建上下文(build context)复制到镜像中。与 COPY 指令类似,但 ADD 还支持一些额外的功能,如自动解压缩压缩文件。不过,通常建议优先使用 COPY,因为它更简单且功能明确。


基本语法

1
ADD <源路径> <目标路径>
  • 源路径:可以是本地文件、目录,或者是一个 **URL(自动下载保存,不会自动解压)**。
  • 目标路径:镜像中的目标路径,通常是相对于工作目录(WORKDIR)的路径。

示例

1. 复制本地文件到镜像中

假设你有一个名为 app.jar 的文件在当前目录下,你想将其复制到镜像的 /app 目录中:

1
ADD app.jar /app/app.jar

2. 复制本地目录到镜像中

如果你有一个名为 src 的目录,想将其复制到镜像的 /app/src 目录中:

1
ADD src /app/src

3. 从 URL 复制文件

你可以直接从 URL 下载文件并复制到镜像中:

1
ADD https://example.com/file.zip /app/file.zip

⚠️:不会自动解压,解压前提源文件是个压缩文件非URL

特殊功能

ADD 指令有一个特殊功能:如果源路径是一个压缩文件(如 .zip, .tar, .gz 等),并且目标路径是一个目录,Docker 会自动解压缩该文件到目标目录中。

示例:

假设你有一个 archive.tar.gz 文件,你想将其解压到 /app 目录中:

1
ADD archive.tar.gz /app/

执行后,archive.tar.gz 会被解压到 /app 目录下。

推荐使用 COPY 指令

虽然 ADD 提供了额外的功能,但大多数情况下,COPY 指令已经足够使用,并且更易于理解和维护。COPY 只负责复制文件和目录,不会进行任何额外的处理。

推荐示例:

1
2
COPY app.jar /app/app.jar
COPY src /app/src

总结

  • **使用 ADD**:当你需要从 URL 复制文件,或者需要自动解压缩本地压缩文件时。
  • **使用 COPY**:在大多数其他情况下,COPY 更为合适,因为它功能简单明了。

确保在使用 ADDCOPY 时,源路径是相对于构建上下文的,即 Dockerfile 所在目录及其子目录中的文件和文件夹。