COPY指令用于将构建上下文中的文件或目录复制到镜像指定位置,源路径须为相对路径且存在于上下文中,目标路径可为绝对或相对于WORKDIR的路径,支持跨阶段复制、权限与归属控制,但不支持宿主机绝对路径或环境变量。
copy 指令是 dockerfile 中最常用、最安全的文件复制方式,它只做一件事:把构建上下文里的文件或目录原样复制进镜像指定位置。关键在于“构建上下文”——不是任意宿主机路径,而是 docker build 命令执行时所指定的目录及其子目录。
COPY 的基本写法和路径规则
语法很简单:COPY
-
源路径必须是相对路径,且文件/目录必须存在于构建上下文中(比如
COPY app.py .或COPY config/ /app/config/) -
目标路径可以是绝对路径(如
/app/),也可以是相对于 WORKDIR 的相对路径(如./bin/) - 如果目标路径不存在,Docker 会自动创建父目录;但不会递归创建深层嵌套结构(比如
/a/b/c/d中若/a/b缺失,可能失败) - 源路径末尾带斜杠(
src/)表示复制目录内容;不带斜杠(src)则按文件或目录名整体复制
常见使用场景和写法示例
根据你要复制的内容类型,选择对应方式:
- 复制单个文件到工作目录:
COPY main.go . - 复制单个文件到指定绝对路径:
COPY nginx.conf /etc/nginx/nginx.conf - 复制整个目录(含内容):
COPY assets/ /usr/share/nginx/html/ - 复制多个文件到同一目录:
COPY package.json yarn.lock .env /app/ - 用通配符匹配(如所有 .py 文件):
COPY *.py /app/ - 处理含特殊字符的文件名(如
log[1].txt):COPY log[[1]].txt /app/
跨阶段复制(多阶段构建中常用)
在多阶段构建中,COPY 可从上一构建阶段提取产物,避免把编译工具等打入最终镜像:
- 先定义构建阶段:
FROM golang:1.21 AS builder - 在该阶段编译出二进制:
COPY main.go . && go build -o myapp . - 切换运行阶段后复制产物:
COPY --from=builder /app/myapp /usr/local/bin/
权限与归属控制(可选增强)
Docker 20.10+ 支持直接设置文件属主和权限,省去后续 RUN chown/chmod:
- 指定用户组:
COPY --chown=www-data:www-data nginx.conf /etc/nginx/ - 设置执行权限:
COPY --chmod=755 deploy.sh /usr/local/bin/ - 组合使用:
COPY --chown=node:node --chmod=644 package.json /app/
记住:COPY 发生在 构建镜像时,不是运行容器时;它不支持绝对路径(如 /home/user/file.txt)或环境变量(如 $HOME/file.txt)。一切以构建上下文为起点,路径写对了,复制就稳了。


















