核心是构建阶段避免冗余而非后期删除;选-slim基础镜像降体积30%~50%,用多阶段构建隔离编译与运行环境,合并安装与清理指令防缓存残留,借助dive/docker scout定位空间占用关键点。

直接降低生产镜像存储成本,核心不是后期“删文件”,而是在构建阶段就避免写入冗余内容。工具只是放大器,真正起效的是构建逻辑的重构。
选对基础镜像,砍掉一半体积起点
很多镜像默认用 ubuntu:22.04 或 centos:stream8 这类完整发行版作基础,自带 man、vim、gcc、文档、locale 数据等——生产环境根本用不上。换成官方提供的 -slim 变体(如 python:3.11-slim、node:20-slim),体积可降 30%~50%。比 alpine 更稳,没有 glibc 兼容风险。
验证方法:运行 docker history your-image-name,看最底层是不是完整系统镜像;替换只需改一行:
FROM ubuntu:22.04 → FROM ubuntu:22.04-slim
用好多阶段构建,彻底隔离编译环境
Go、Rust、Java、Node.js 构建项目时,编译器、源码、devDependencies、.git、package-lock.json、dist/ 中的 map 文件等,都不该进最终镜像。多阶段构建让编译和运行完全分离:
- 第一阶段用 golang:1.21 或 node:20-build 完成构建
- 第二阶段用 alpine:latest 或 debian:slim,只 COPY --from=builder 输出的二进制或 dist/ 目录
- 不复制 node_modules 全量,而是用 npm ci --only=production 单独安装
同一 RUN 指令内完成安装+清理,防止缓存残留
Docker 层是只读的,跨层删除无效。比如先 RUN apt-get install curl,再 RUN apt-get clean,缓存仍在第一层里。必须合并为一行:
- Debian/Ubuntu:RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
- Alpine:RUN apk add --no-cache curl 或用 .build-deps 虚拟包分组清理
- Python:RUN pip install --no-cache-dir -r requirements.txt
用 dive 或 docker scout 定位真实“胖点”
工具不自动瘦身,但能快速告诉你哪一层、哪个目录吃掉了最多空间:
- dive your-image:latest:交互式查看每层新增/删除文件,按大小排序目录,一眼发现重复依赖、/var/log、/usr/share/doc、调试符号(.debug)
- docker scout cves your-image:latest:顺带暴露过时基础镜像带来的安全漏洞,推动升级决策
重点关注:多个镜像共用的 base 层是否统一?相同依赖是否在不同服务中重复打包?这些才是 TB 级存储节省的关键杠杆。


















