一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Docker 基础镜像 FROM 多阶段引用如何写

时间:2026-08-08 08:22:48 编辑:袖梨 来源:一聚教程网

FROM指令不支持多阶段引用,跨阶段复用需用COPY --from=;每个FROM启动独立阶段,可命名(AS)或索引;COPY --from支持引用具名阶段、索引阶段或外部镜像。

FROM 指令本身不支持“多阶段引用”,它只负责开启一个新构建阶段,不能直接从其他阶段“引用”或“继承”。真正实现跨阶段复用的,是 COPY --from=(不是 FROM),这是多阶段构建中资源传递的核心机制。

你可能想问的是:如何在 Dockerfile 中正确使用 FROM 定义多个阶段,并配合 --from 引用它们? 下面分几个关键点讲清楚:

FROM 指令怎么写多阶段

每个 FROM 启动一个独立阶段,可命名、可索引:

# 阶段1:命名为 builderFROM golang:1.21 AS builderWORKDIR /appCOPY . .RUN go build -o myapp .# 阶段2:命名为 runtimeFROM alpine:latest AS runtimeWORKDIR /root# 注意:这里不是 FROM --from=...,而是 COPY --from=...COPY --from=builder /app/myapp .CMD ["./myapp"]

正确写法:

  1. FROM <image> AS <name> → 定义并命名阶段
  2. FROM <image> → 定义未命名阶段(后续可用 --from=0--from=1 引用)

❌ 错误写法(语法不合法):

  1. FROM --from=builder
  2. FROM builder ❌(FROM 只接受镜像名/标签,不接受阶段名)

COPY --from 的三种引用方式

这才是“多阶段引用”的实际操作位置:

  1. 引用具名阶段COPY --from=builder /src /dst
  2. 引用索引阶段COPY --from=0 /src /dst(第一个 FROM 是索引 0)
  3. 引用外部镜像COPY --from=nginx:alpine /etc/nginx/nginx.conf ./nginx.conf

多阶段常见组合写法示例(Python 应用)

# 阶段1:安装依赖 + 编译(含编译工具)FROM python:3.11-slim-bookworm AS builderRUN apt-get update && apt-get install -y --no-install-recommends build-essential gcc libc-dev && rm -rf /var/lib/apt/lists/*COPY requirements.txt .RUN pip install --prefix=/install -r requirements.txt# 阶段2:纯运行时(无编译器)FROM python:3.11-slim-bookwormCOPY --from=builder /install /usr/localCOPY --from=builder /usr/lib/python3.11/encodings /usr/lib/python3.11/encodingsCOPY . /appWORKDIR /appCMD ["python", "app.py"]

小贴士:避免踩坑

  1. --from= 必须指向已定义的阶段(按顺序,不能向前引用未出现的阶段)
  2. 每个 FROM 都会重置环境变量、工作目录等,前一阶段内容不会自动继承
  3. 最终镜像只包含最后一个 FROM 阶段的内容,前面阶段只是临时构建上下文
  4. 命名阶段(AS xxx)不是必须的,但强烈推荐——可读性高、维护方便、调试时可指定 --target xxx

不复杂但容易忽略。

热门栏目