docker history 可按体积倒序列出各层大小及对应指令,快速定位“胖层”;结合 dive 交互式下钻,能可视化每层新增文件、搜索关键词、确认冗余路径,精准识别如 /var/lib/apt/lists/ 或 node_modules 等体积污染源。

直接用 docker history 查各层大小,再配合 dive 交互式下钻,就能准确定位哪一层、哪个路径拖垮了体积。
用 docker history 快速排序可疑层
执行命令可按体积倒序列出每一层及其来源指令:
docker history --format "{{.Size}}\t{{.CreatedBy}}" your-image:latest | sort -hr | head -10
重点关注那些明显偏大的层(比如几百MB),看它对应的是哪条 RUN 或 COPY 指令。常见“罪魁”包括:
-
RUN apt-get install ... 后没清理
/var/lib/apt/lists/ -
COPY . /app 把
node_modules、.git、dist/全拷进去了 - FROM golang:1.22 作为最终镜像,把整个编译器链都留在运行层
用 dive 深度查看每层文件构成
dive 是专为镜像分层分析设计的工具,能可视化每层新增了哪些文件、占多少空间:
curl -sS https://webi.sh/dive | sh
export PATH="$HOME/.local/bin:$PATH"
dive your-image:latest
进入后可:
- 按 Size 列排序,一眼锁定最大文件夹(如
/usr/src/app/node_modules或/root/.cache/pip) - 用方向键展开某一层,查看具体新增路径
- 输入
/搜索关键词,比如搜.debug、__pycache__、.dist-info
针对性验证可疑路径内容
确认某层是否真包含冗余内容,可临时运行该层镜像检查:
docker run --rm -it your-image:latest sh -c "du -sh /usr/local/lib/python*/site-packages/* 2>/dev/null | sort -hr | head -5"
典型污染路径和对应操作:
-
/var/lib/apt/lists/→ 安装后立即rm -rf /var/lib/apt/lists/* -
/root/.cache/pip→ 构建末尾加RUN rm -rf /root/.cache/pip -
/usr/local/lib/python*/site-packages/*/__pycache__→find ... -name '__pycache__' -exec rm -rf {} + -
/app/*.log或/app/debug.pprof→ 改用.dockerignore过滤
注意多阶段构建中的“隐性拷贝”陷阱
即使用了多阶段,如果 COPY --from=builder 路径写宽了,也会把不该带的东西一起拉进来。例如:
- 错误:
COPY --from=builder /app /app→ 可能复制了未清理的poetry.lock或临时 tar 包 - 正确:
COPY --from=builder /app/main.py /app/或/usr/local/bin/gunicorn /usr/local/bin/
建议在 builder 阶段结尾加 ls -la /app,确认只留下真正需要的产物。











