COPY 是 Docker 构建中精准复制本地文件到镜像的核心指令,支持通配符与多源路径,应避免 COPY . .,配合 .dockerignore 和多阶段构建提升效率、安全与镜像精简。
在 Docker 构建过程中,
指令是将本地文件或目录复制到镜像指定路径的核心方式。它不依赖外部工具或运行时环境,执行简单、语义明确,适合按需导入项目源码——即只复制构建真正需要的文件,避免冗余内容污染镜像、拖慢构建速度或引入安全隐患。
精准控制复制范围,避免全量拷贝
支持通配符和多源路径,可组合使用以精确筛选源码文件。例如,仅复制 Python 项目必需的代码与配置:
—— 先单独复制依赖文件,便于利用 Docker 层缓存(后续 pip install 可复用)
—— 只复制实际源码目录,跳过测试、文档、IDE 配置等无关内容
—— 若项目为扁平结构,可按后缀筛选主逻辑文件
不推荐使用
,尤其当项目根目录包含
、
、
等大体积或敏感目录时,不仅增大镜像体积,还可能因缓存失效导致频繁重构建。
结合 .dockerignore 提升 COPY 效率与安全性
文件在
执行前生效,用于排除本地不希望被送入构建上下文的文件。它不是 Dockerfile 指令,但与
协同工作:
在项目根目录创建
,添加:
这样即使
出现,也不会把
或
带入镜像;更推荐配合显式
使用,双重保障
分阶段 COPY 实现开发与生产分离
对编译型语言(如 Go、Rust)或含构建步骤的前端项目,可借助多阶段构建,仅在最终镜像中
运行时必需产物:
第一阶段用完整 SDK 编译代码(如
),生成二进制
第二阶段基于轻量基础镜像(如
),仅
最终镜像不含源码、编译器、依赖源,体积小、攻击面小
注意 COPY 的路径语义与权限继承
默认保留源文件的读写权限(不保留执行权限),且目标路径若不存在会自动创建。常见注意事项:
源路径为相对路径时,始终相对于构建上下文(即
中的
)
目标路径若以
结尾,则被识别为目录,自动将源内容解包进去;否则视为目标文件名
如需赋予执行权限,可在
后加
,或改用
(不推荐,功能过度)
COPYCOPYCOPY requirements.txt .COPY src/ app/src/COPY *.py .COPY . .node_modules.gitvenv.dockerignoreCOPYCOPY.dockerignore.git
__pycache__
*.log
.env
Dockerfile
.dockerignoreCOPY . ..env.gitCOPYCOPYgolang:1.22alpine:latestCOPY --from=0 /app/myapp /usr/local/bin/myappCOPYdocker build -f Dockerfile ../COPYRUN chmod +x /path/to/binaryADD