首页/云/云与容器速查/Dockerfile FROM 基础镜像
容器与 Docker106 条

Dockerfile FROM 基础镜像

每个构建阶段的起点,决定系统能力与镜像体积。生产建议固定 tag 或 digest,并按需声明 --platform,避免 latest 漂移导致构建结果不可复现。

云与容器速查云更新于 2026-10-13

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 版本,否则会出现运行时找不到共享库的问题,报错信息通常不明显。

易错点

  • 用 FROM 镜像:latest,上游一变构建结果全变,排错毫无线索
  • 多阶段构建里忘了重新声明 ARG,第二阶段读到空值导致产物路径错乱
  • alpine 基础镜像配 glibc 依赖的二进制,启动即报找不到共享库
  • distroless 镜像里想进容器调试,发现连 shell 都没有,必须换用临时调试容器

数据来源与参考

  • Docker Docs:Dockerfile reference(FROM)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌