构建与制品管理58 条

镜像瘦身要点

在保证可调试的前提下压缩镜像:清理包缓存、多阶段构建、选择更小的基础镜像,并用工具量化体积变化。

CI/CD 与发布速查开发更新于 2026-10-13

镜像瘦身是什么

镜像瘦身是在保证可调试的前提下压缩镜像体积:更小的镜像分发更快、拉取更省时,攻击面也更小(包越少,漏洞面越窄)。常用手段:多阶段构建(构建工具链不进最终镜像)、清理包缓存、选择精简基础镜像、只拷贝运行必需文件。核心机制是镜像层是增量的:同一层里「安装又删除」才不占体积,跨层删除无效。动手前先用工具量化层体积构成,改完再量化对比,避免盲目优化。

基本信息

常见手段apt 清理、多阶段、上游 slim/alpine 基础镜像、只拷贝运行必需文件
量化docker history、dive 查看层体积构成
多阶段构建工具留在构建阶段,运行阶段只带产物
权衡过度裁剪会牺牲排障能力,保留必要工具或提供 debug 变体

典型使用场景

  • 分发慢:镜像几百 MB 起步、节点拉取超时,瘦身后发布与扩容都更快。
  • 攻击面治理:减少镜像内包数量,扫描器告警量同步下降。
  • CI 缓存效率:镜像层更小,缓存命中收益更大、推送更快。
  • 边缘与离线场景:带宽与存储受限时,体积直接影响可部署性。
  • 成本控制:镜像仓库存储与跨区复制流量随体积下降。

多阶段与层清理

多阶段与层清理
# 多阶段:构建依赖不进最终镜像
FROM golang:1.22 AS build
RUN go build -o /app ./cmd/app
FROM debian:bookworm-slim
COPY --from=build /app /usr/local/bin/app
# 同层内安装并清理缓存
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates \
 && rm -rf /var/lib/apt/lists/*

手段与效果

手段效果注意
多阶段构建剥离编译工具链复制产物不要遗漏依赖文件
包缓存清理减少安装层体积必须与安装同层执行
精简基础镜像缩小底座兼容性与调试能力评估
精确 COPY避免无关文件入镜像配合 .dockerignore 使用
层是增量的:同一层里「安装又删除」才不占体积,跨层删除无效,清理命令必须和安装写进同一个 RUN。
瘦身与排障要平衡:没 shell、没 curl 的镜像出事时无从下手,保留最小工具集或产出独立的 debug 镜像变体。

易错点

  • 跨层删除文件:该层仍占体积,把安装与清理合并到同一 RUN。
  • 为省体积删除证书/时区/字体:运行期才暴露问题(TLS 失败、乱码),构建后跑完整功能验证。
  • 直接 COPY 整个目录:源码、密钥、缓存文件进入镜像,用 .dockerignore 加精确复制路径。
  • 删除 shell 导致探针失效:健康检查命令依赖的工具要保留,或改用无命令探针。
  • 只看最终体积不看层构成:改动没落在正确层上,用 dive 核对每层增量再继续优化。

数据来源与参考

  • Docker Docs《Best practices for writing Dockerfiles》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌