--from 选项实现跨阶段资产复用,仅提取指定路径文件;需显式命名源阶段(AS),支持内外镜像引用;可配合 --chown/--chmod 设定权限;禁止用索引引用,须确保路径存在。
COPY 指令的 --from 选项是实现跨阶段镜像资产复用的核心机制,它不复制整个镜像,只提取指定路径下的文件或目录,轻量、精准、可控。
明确指定源阶段名称
在多阶段构建中,必须为前一阶段显式命名(使用 AS),后续才能通过 --from=阶段名 引用:
- 第一阶段定义: FROM golang:1.21 AS builder
- 第二阶段引用: COPY --from=builder /app/myapp /usr/local/bin/
- 阶段名区分大小写,且必须与 AS 后的标识完全一致
支持外部镜像直接拉取
--from 不限于本 Dockerfile 内部阶段,还可指向任意可访问的远程或本地镜像:
- 从预构建基础镜像拷贝证书:COPY --from=alpine:3.19 /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
- 复用团队共享的工具镜像:COPY --from=registry.example.com/base/tools:v1.2 /usr/local/bin/validate /usr/local/bin/
- 要求目标镜像存在且路径有效;若镜像未本地缓存,Docker 会自动拉取
配合权限与权限控制提升安全性
跨阶段复制后,文件默认归属 root 用户。可通过 --chown 和 --chmod 在复制时直接设定运行时所需权限:
- 设置属主和组:COPY --from=builder --chown=app:app /app/myapp /usr/local/bin/
- 限制执行权限:COPY --from=builder --chmod=755 /app/myapp /usr/local/bin/
- 避免后续 RUN chown 或 chmod 指令,减少镜像层、提升构建效率与最小权限原则落地效果
注意依赖声明与构建顺序稳定性
--from 是显式依赖声明,但需避免隐式耦合:
- 禁用整数索引(如 --from=0),因阶段增删会导致引用错位
- 确保被引用阶段确实生成了目标路径下的文件,否则构建失败
- 若阶段间有构建参数(ARG)传递,需在对应阶段提前声明并使用