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

FROM 指令本身不支持“多阶段引用”,它只负责开启一个新构建阶段,不能直接从其他阶段“引用”或“继承”。真正实现跨阶段复用的,是 COPY --from=(不是 FROM),这是多阶段构建中资源传递的核心机制。
你可能想问的是:如何在 Dockerfile 中正确使用 FROM 定义多个阶段,并配合 --from 引用它们? 下面分几个关键点讲清楚:
FROM 指令怎么写多阶段
每个 FROM 启动一个独立阶段,可命名、可索引:
# 阶段1:命名为 builder FROM golang:1.21 AS builder WORKDIR /app COPY . . RUN go build -o myapp . # 阶段2:命名为 runtime FROM alpine:latest AS runtime WORKDIR /root # 注意:这里不是 FROM --from=...,而是 COPY --from=... COPY --from=builder /app/myapp . CMD ["./myapp"]
✅ 正确写法:
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
-
FROM <image> AS <name></name></image>→ 定义并命名阶段 -
FROM <image></image>→ 定义未命名阶段(后续可用--from=0、--from=1引用)
❌ 错误写法(语法不合法):
-
FROM --from=builder❌ -
FROM builder❌(FROM只接受镜像名/标签,不接受阶段名)
COPY --from 的三种引用方式
这才是“多阶段引用”的实际操作位置:
-
引用具名阶段:
COPY --from=builder /src /dst -
引用索引阶段:
COPY --from=0 /src /dst(第一个FROM是索引 0) -
引用外部镜像:
COPY --from=nginx:alpine /etc/nginx/nginx.conf ./nginx.conf
多阶段常见组合写法示例(Python 应用)
# 阶段1:安装依赖 + 编译(含编译工具)
FROM python:3.11-slim-bookworm AS builder
RUN 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-bookworm
COPY --from=builder /install /usr/local
COPY --from=builder /usr/lib/python3.11/encodings /usr/lib/python3.11/encodings
COPY . /app
WORKDIR /app
CMD ["python", "app.py"]
小贴士:避免踩坑
-
--from=必须指向已定义的阶段(按顺序,不能向前引用未出现的阶段) - 每个
FROM都会重置环境变量、工作目录等,前一阶段内容不会自动继承 - 最终镜像只包含最后一个
FROM阶段的内容,前面阶段只是临时构建上下文 - 命名阶段(
AS xxx)不是必须的,但强烈推荐——可读性高、维护方便、调试时可指定--target xxx
不复杂但容易忽略。










