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 | COPY app.jar /app/app.jar |
总结
- **使用
ADD
**:当你需要从 URL 复制文件,或者需要自动解压缩本地压缩文件时。 - **使用
COPY
**:在大多数其他情况下,COPY
更为合适,因为它功能简单明了。
确保在使用 ADD
或 COPY
时,源路径是相对于构建上下文的,即 Dockerfile 所在目录及其子目录中的文件和文件夹。