github编辑

COPY 复制文件

基本语法

COPY [选项] <源路径>... <目标路径>
COPY [选项] ["<源路径1>", "<源路径2>", ... "<目标路径>"]

COPY 指令将构建上下文中的文件或目录复制到镜像内。


基本用法

复制单个文件

# 复制文件到指定目录
COPY package.json /app/

# 复制文件并重命名
COPY config.json /app/settings.json

复制多个文件

# 复制多个指定文件
COPY package.json package-lock.json /app/

# 使用通配符
COPY *.json /app/
COPY src/*.js /app/src/

复制目录

⚠️ 注意:复制目录时,复制的是目录的内容,不包含目录本身。


通配符规则

COPY 支持 Go 的 filepath.Match 通配符规则:

通配符
说明
示例

*

匹配任意字符序列

*.json

?

匹配单个字符

config?.json

[abc]

匹配括号内任一字符

[abc].txt

[a-z]

匹配范围内字符

file[0-9].txt


目标路径

绝对路径

相对路径(基于 WORKDIR)

自动创建目录

如果目标目录不存在,Docker 会自动创建:


修改文件所有者

使用 --chown 选项设置文件的用户和组:

💡 结合 USER 指令使用,确保应用以非 root 用户运行。


保留文件元数据

COPY 会保留源文件的元数据:

  • 读、写、执行权限

  • 修改时间

这对于脚本文件特别重要:


COPY vs ADD

特性
COPY
ADD

复制本地文件

自动解压 tar

支持 URL

✅(不推荐)

推荐程度

推荐

⚠️ 特殊场景使用

笔者建议:除非需要自动解压 tar 文件,否则始终使用 COPY。明确的行为比隐式的魔法更好。


多阶段构建中的 COPY

从其他构建阶段复制

--link 的优势:

  • 更高效利用构建缓存

  • 并行化构建过程

  • 加速多阶段构建


.dockerignore

使用 .dockerignore 排除不需要复制的文件:

这可以:

  • 减小构建上下文大小

  • 加速构建

  • 避免复制敏感文件


最佳实践

1. 利用缓存,先复制依赖文件

2. 使用 .dockerignore

3. 明确复制路径


本章小结

操作
示例

复制文件

COPY app.js /app/

复制多个文件

COPY *.json /app/

复制目录内容

COPY src/ /app/src/

修改所有者

COPY --chown=node:node . /app/

从构建阶段复制

COPY --from=builder /app/dist ./

延伸阅读

最后更新于