copy --from 是多阶段构建中唯一标准的跨镜像文件复制方式,支持本阶段、远程及本地镜像作为源,需确保路径存在,可结合 --chown 和 --chmod 直接设定权限,并推荐用 as 命名与 arg 提升可维护性。
copy --from 是多阶段构建中从其他镜像复制指定文件资产的唯一标准方式,它不拉取整个镜像,只提取你明确声明的路径下的文件或目录,轻量、可控、安全。
支持三类源镜像:本文件内阶段、外部远程镜像、本地已存在镜像
你可以用 --from 指向不同来源,只要 Docker 能访问到该镜像且目标路径真实存在:
-
本 Dockerfile 内部阶段:必须显式命名(用 AS),例如
FROM golang:1.21 AS builder,后续写COPY --from=builder /app/myapp /usr/local/bin/ -
远程镜像(自动拉取):如
COPY --from=alpine:3.19 /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/,Docker 会按需拉取 alpine:3.19 镜像并读取对应路径 -
本地已有镜像:比如团队私有工具镜像
COPY --from=registry.example.com/base/tools:v1.2 /usr/local/bin/validate /usr/local/bin/,前提是该镜像已 pull 到本地或可联网访问
必须确保路径存在,否则构建直接失败
--from 不做容错,它严格校验源镜像中指定路径是否真实存在:
- 若引用
--from=builder,请确认 builder 阶段确实生成了/app/myapp,比如通过RUN ls -l /app/或ls -l /app/myapp在构建时验证 - 若引用外部镜像(如
debian:12),建议先本地运行容器确认路径:docker run --rm debian:12 ls -l /usr/bin/curl - 避免使用整数索引(如
--from=0),阶段增删会导致引用错位,生产环境应始终用 AS 命名 + 显式名称引用
复制时可直接设定权限,减少镜像层
跨阶段复制后的文件默认属主是 root:root,权限也继承源镜像设置。你可以在 COPY 这一步就完成权限适配:
- 用
--chown=app:app设定运行用户归属,例如COPY --from=builder --chown=app:app /app/myapp /usr/local/bin/ - 用
--chmod=755控制执行权限,避免后续再跑RUN chmod +x增加一层 - 两个参数可同时使用:
COPY --from=builder --chown=app:app --chmod=755 /app/myapp /usr/local/bin/
不推荐隐式依赖,建议配合 ARG 和构建参数增强可维护性
如果被引用的阶段需要动态路径或版本(比如不同分支编译产物路径不同),可在对应阶段提前声明 ARG:
- 在 builder 阶段开头加
ARG BUILD_OUTPUT_DIR=/app/dist - 构建时传参:
docker build --build-arg BUILD_OUTPUT_DIR=/out . - 后续复制就可写
COPY --from=builder $BUILD_OUTPUT_DIR/myapp /usr/local/bin/










