FROM 是什么
FROM 指定基础镜像并开启一个构建阶段:它是每条构建路径的起点,镜像里的文件系统、包管理器与运行时会从这一层继承下来。多阶段构建里每个 FROM 都是一个独立阶段,阶段之间用复制指令传递产物,最终镜像默认取最后一段。
基本信息
| 语法 | FROM IMAGE[:TAG|@DIGEST] [AS 阶段名] |
|---|---|
| 位置要求 | 必需且至少一条;之前只能出现构建期参数声明与注释 |
| 标签写法 | 具体版本标签最常用,摘要最严格,latest 语义最模糊 |
| 阶段引用 | 命名后用复制指令从该阶段取文件,也可用于指定构建目标 |
| 平台参数 | 可指定目标平台,用于交叉构建多架构镜像 |
典型使用场景
- 选定运行环境:按语言与版本挑选官方镜像,例如带版本号的语言运行时镜像
- 拆分构建与运行:编译用完整工具链镜像,运行用精简镜像,成品体积大幅下降
- 减少维护成本:使用发行版提供的最小变体,同时获得安全更新
- 固定可复现环境:锁定具体版本标签或摘要,避免同一描述在不同时间产出不同结果
- 引入自定义基础镜像:企业内部统一的基础镜像封装了证书、时区与安全基线
常见写法
常见写法
FROM alpine:3.20 # 最小化的通用起点
FROM node:22-alpine AS builder # 命名阶段,供后续阶段引用
FROM gcr.io/distroless/static-debian12:nonroot # 只带运行时依赖的精简基础
# 多阶段组合
FROM golang:1.23 AS build
WORKDIR /src
COPY . .
RUN CGO_ENABLED=0 go build -o /out/app ./cmd/app基础镜像怎么选
| 类型 | 特点 | 适用场景 |
|---|---|---|
| 完整发行版镜像 | 工具齐全,体积大 | 临时排查与需要包管理器的构建阶段 |
| 精简变体 | 体积小,工具较少 | 编译与运行兼顾的常规服务 |
| 无发行版镜像 | 只有运行时与证书,无 shell | 追求小体积与低攻击面的最终镜像 |
| 私有基础镜像 | 内置企业证书与安全基线 | 内部合规要求统一维护的场景 |
选完之后的收尾动作
- 确认标签是否存在且长期维护,避免选到已停止更新的分支
- 核对架构与平台,本地构建与部署集群的处理器架构不一致时要在构建期指定
- 检查镜像内是否已有可用的包管理器与证书,精简镜像往往需要额外补装
- 固定版本后更新基础镜像要有节奏,长期不更新会积累安全补丁缺口
- 内部基础镜像变更要与使用方打招呼,基础层改动会影响所有下游镜像
依赖浮动标签会让每次构建结果漂移。关键服务锁定具体版本号,对可复现性要求更高的场景按摘要引用。
构建路径里至少要有一条 FROM,并且它之前不能出现运行命令或复制文件这类指令,否则构建一开始就会失败。
基础镜像的长期维护
- 记录每个服务的基线与版本,升级前先在小范围验证,再统一推进
- 关注基础镜像的安全公告,重新构建往往就能拿到补丁,无需改业务代码
- 先构建再回归,基础层变化可能影响动态链接库与证书链
- 定期清理不再使用的基础镜像,避免本地与仓库堆积大量历史层
- 内部基础镜像要有变更通知机制,使用方需要评估兼容性再跟随升级