FROM 指令是什么
FROM 指定构建的基础镜像,是每个构建阶段的起点,它决定了运行时具备哪些系统能力、安装了什么包管理器,也决定了镜像的起点体积。生产环境建议固定小版本标签或直接锁镜像摘要,避免上游镜像一变导致构建结果不可复现;多阶段构建则用多个 FROM,把编译环境与运行环境彻底分开。
基本信息
| 语法 | FROM [--platform=平台] 镜像[:标签|@摘要] [AS 阶段名] |
|---|---|
| 基础镜像选型 | alpine 体积小但用 musl;debian-slim 兼容性好;distroless 无 shell 更安全 |
| 多阶段 | FROM ... AS build,后续用 COPY --from=build 取产物 |
| 可复现 | 锁镜像摘要或至少固定小版本标签,不用 latest |
| 跨平台 | 用 --platform 指定目标架构,配合构建工具生成多架构镜像 |
典型使用场景
- 编译型语言:用官方 SDK 镜像做构建阶段,运行阶段换成精简基础镜像
- 减小体积:从完整发行版换到 slim 或 distroless,镜像可小一个量级
- 多架构构建:用 --platform 搭配构建工具,一次产出 amd64 与 arm64 镜像
- 安全基线:用 distroless 基础镜像去掉 shell 与包管理器,减少攻击面
- 依赖复用:基础镜像统一由平台团队维护,业务只在其上叠加
多阶段构建示例
多阶段构建示例
# 构建阶段:带完整工具链,体积大但不进最终镜像
FROM --platform=$BUILDPLATFORM golang:1.23 AS build
WORKDIR /src
COPY . .
RUN CGO_ENABLED=0 go build -o /out/app . # 静态编译,便于放进精简镜像
# 运行阶段:只保留可执行文件,镜像体积与攻击面都更小
FROM gcr.io/distroless/static-debian12
COPY --from=build /out/app /app
ENTRYPOINT ["/app"]常见基础镜像对比
| 镜像 | 体积量级 | 特点 | 适用 |
|---|---|---|---|
| debian 完整版 | 较大 | 兼容性最好,工具齐全 | 复杂依赖、老项目 |
| debian-slim | 中等 | 去掉部分文档与工具 | 多数通用服务 |
| alpine | 很小 | 基于 musl,glibc 依赖可能不兼容 | 静态编译或纯脚本服务 |
| distroless | 小 | 无 shell、无包管理器 | 安全要求高的生产环境 |
| scratch | 最小 | 完全空白,仅有放入的文件 | 静态二进制、极致精简 |
首个 FROM 之前声明的 ARG 只能在 FROM 行本身使用(例如选标签);要在阶段内部使用,必须在阶段里重新声明一次 ARG,否则读到的是空值。
基础镜像换到 alpine 前要确认依赖是静态编译或已有对应的 musl 版本,否则会出现运行时找不到共享库的问题,报错信息通常不明显。