COPY 是什么
从构建上下文把文件或目录复制进镜像,是往镜像里放内容的首选指令。它不自动解压、不支持远程地址,行为简单可预期,配合排除规则能精确控制哪些文件进入镜像。多阶段构建里还能从其他阶段直接复制产物。
基本信息
| 语法 | COPY [选项] 源... 目标 |
|---|---|
| 路径基准 | 构建上下文根目录,不是构建描述所在目录 |
| 常用选项 | --from 从指定阶段或镜像复制 --chown 指定属主 --chmod 指定权限 |
| 多个源 | 源有多个时目标必须是目录 |
| 通配符 | 支持简单的通配匹配,便于批量复制同类型文件 |
典型使用场景
- 复制依赖清单:先只复制依赖描述文件,让依赖安装层可以复用缓存
- 复制源码:依赖装好后再复制业务代码,改动代码不会触发重新安装
- 从构建阶段取产物:编译阶段产出可执行文件,运行阶段只复制这一个文件
- 放入配置文件:把默认配置与启动脚本放进镜像的约定目录
- 注入证书与静态资源:把证书链、前端静态文件放到运行需要的路径
常用示例
常用示例
COPY package.json package-lock.json ./ # 先复制依赖清单利用缓存
COPY src/ /app/src/ # 复制源码目录
COPY --from=build /out/app /usr/local/bin/app # 从构建阶段取产物
COPY --chown=1000:1000 ./config /app/config # 复制并指定属主
COPY *.sh /opt/scripts/ # 通配批量复制与另一个复制指令的差别
| 对比项 | COPY | 另一个复制指令 |
|---|---|---|
| 自动解压 | 不支持 | 本地压缩包会自动解压 |
| 远程地址 | 不支持 | 可直接从网络地址下载 |
| 行为可预期性 | 高,行为简单 | 隐式能力多,容易出现意外结果 |
| 推荐程度 | 日常复制的首选 | 仅在确实需要解压或下载时使用 |
| 缓存影响 | 内容变化即失效 | 远程内容变化时缓存判断不如本地文件直观 |
写复制前的检查
- 确认目标路径是否在镜像里存在,不存在时按文件语义处理,可能得到意外的文件名
- 多个源复制时目标写成目录,避免被当成重命名
- 检查排除规则有没有把这些文件挡住,被挡住的源会直接报错
- 复制源码时留意不要让本地的依赖目录覆盖容器里已装好的依赖
- 关键文件复制后核对属主与权限,运行用户需要有读取权限
源路径不能跳出构建上下文。需要复制上下文之外的文件时,要么扩大上下文范围,要么调整目录结构,硬写上层路径会直接构建失败。
多阶段构建里从其他阶段复制产物是压缩最终镜像体积的关键手段:工具链留在构建阶段,运行阶段只带产物与运行时依赖。