镜像瘦身是什么
镜像体积来自基础系统、运行时依赖、构建工具与应用产物四部分。瘦身的思路是让运行镜像只保留最后一部分必须的内容:换精简基础镜像减少系统层,用多阶段构建把编译工具留在上游阶段,把安装与清理写进同一条指令避免缓存残留,再用忽略文件把无关内容挡在构建上下文之外。每一步都能量化验收,避免凭感觉删依赖。
基本信息
| 基础镜像选型 | slim、alpine、distroless 等精简变体,按 libc 依赖选择 |
|---|---|
| 多阶段构建 | 构建工具留在构建阶段,最终阶段只复制产物 |
| 同层清理 | 安装与清除缓存写在同一条 RUN 里 |
| 忽略文件 | .dockerignore 排除无关目录与临时文件 |
| 验收手段 | docker images 看体积、docker history 看层构成 |
| 注意事项 | 精简镜像常缺时区、证书、调试工具,需要按需补齐 |
典型使用场景
- 上云前压缩镜像,减少拉取时间与存储成本
- 降低安全扫描告警:减少基础系统里的软件包数量
- 提升发布速度:镜像小则分发与滚动更新更快
- 多阶段构建把编译依赖隔离,避免生产镜像带编译工具
- 排查体积异常增长:逐层对比找出膨胀来源
常见组合
常见组合
# 构建阶段:工具齐全,只管产出
FROM golang:1.23 AS builder
WORKDIR /src
COPY . .
RUN CGO_ENABLED=0 go build -ldflags='-s -w' -o /out/server .
# 运行阶段:只放产物,且安装与清理同层完成
FROM alpine:3.20
RUN apk add --no-cache ca-certificates tzdata
COPY --from=builder /out/server /usr/local/bin/server
USER 10001:10001
ENTRYPOINT ["/usr/local/bin/server"]同层清理与验收
同层清理与验收
# 正确:安装、使用、清理在同一条 RUN 内,缓存不会留在层里
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates \
&& rm -rf /var/lib/apt/lists/*
# 错误示范:清理写在另一条 RUN 里,被删文件仍占层空间
# RUN apt-get update && apt-get install -y curl
# RUN rm -rf /var/lib/apt/lists/*
# 验收:体积与层构成前后对比
docker images --format 'table {{.Repository}}\t{{.Tag}}\t{{.Size}}' | head
docker history app/web:1.0
# 检查构建上下文是否把无关内容送进守护进程
cat .dockerignore手段与收益对照
| 手段 | 减少的是什么 | 代价 |
|---|---|---|
| 换精简基础镜像 | 系统层体积与软件包数量 | 可能缺时区、证书、调试工具 |
| 多阶段构建 | 编译工具与依赖 | 构建文件更复杂 |
| 同层安装清理 | 包管理器缓存的重复层 | 命令需要合并书写 |
| 忽略文件 | 构建上下文体积与缓存失效 | 需维护忽略清单 |
| 编译期裁剪 | 二进制体积 | 调试符号被剥离,现场分析更难 |
先量化再优化:记录改动前后的镜像体积与层构成,避免为了数字删除运行时真正需要的依赖,结果上线即挂。
精简镜像常缺三样东西:根证书、时区数据、动态链接库。切换基础镜像前先确认应用是否依赖它们,逐项验证比事后补救便宜。