copy指令用于构建镜像时将构建上下文中的文件或目录复制到容器指定路径,仅支持本地相对路径,不支持绝对路径或环境变量;add功能更多但易引发意外,官方推荐优先使用copy。
在 dockerfile 中复制宿主机文件到容器指定目录,用的是 copy 指令(推荐)或 add 指令(功能更多但更重)。这个过程发生在构建镜像阶段,不是运行容器时的操作。
COPY 指令:安全、明确、最常用
它只做一件事:把构建上下文(build context)中的本地文件或目录,原样复制进镜像的指定路径。
- 语法:
COPY
-
必须是相对于 Dockerfile 所在目录的相对路径,且文件/目录必须存在于构建上下文中。 -
是容器内的绝对路径(如/app/config.yml),若目录不存在,Docker 会自动创建父目录(但不递归创建深层嵌套路径需谨慎)。
✅ 示例:
# 复制单个配置文件 COPY ./nginx.conf /etc/nginx/nginx.conf # 复制整个 config 目录(内容放入 /app/config/ 下) COPY ./config/ /app/config/ # 复制多个文件(需多条 COPY,或先打包再解压) COPY ./app.js ./package.json /app/
ADD 指令:支持额外能力,但有隐含行为
它也能复制本地文件,还支持:
- 自动解压
.tar,.tar.gz,.tgz等压缩包(解压后内容放入目标路径); - 从 URL 下载并保存(不推荐用于生产,因破坏可重现性且存在安全与缓存风险)。
⚠️ 注意:
-
ADD的自动解压行为容易引发意外(比如误把.tar当普通文件); - 官方文档明确建议:只要
COPY能完成,就优先用COPY。
❌ 不推荐的写法(混淆构建与运行时):
# 错误!宿主机任意路径(如 /home/user/file.txt)无法被 COPY 访问 COPY /home/user/file.txt /app/ # 错误!环境变量在构建时未展开(除非用 ARG + ENV 配合) COPY $HOME/config.json /app/
关键前提:构建上下文(build context)
COPY 只能访问你执行 docker build 命令时指定的上下文目录及其子目录。例如:
docker build -f ./Dockerfile . # 当前目录为上下文 docker build -f ./Dockerfile ./src # ./src 目录为上下文
如果文件不在该目录下,COPY 会报错 no such file or directory。
实用建议
- 把要复制的文件放在 Dockerfile 同级或子目录中,结构清晰;
- 使用
.dockerignore排除不需要传入构建上下文的大文件(如node_modules,.git),加快构建; - 多个小文件尽量合并为一次
COPY(减少镜像层); - 静态资源、配置、启动脚本适合用
COPY固化进镜像; - 动态内容(如日志、上传文件、运行时配置)应通过挂载卷(
-v)或环境变量处理,而非COPY。
不复杂但容易忽略。











