Dockerfile 里 apt-get install 了编译工具,镜像从 180MB 涨到 800MB。后面单独写一行 RUN apt-get clean 体积一点没降。日志里能对上时间点,这种反而好排。

每条 RUN 生成一层,清理命令写在下一层只能删掉新层的文件,上一层装进来的内容还在。镜像大小按所有层累加,删除不会让它变小。这一点先确认清楚,后面就不用反复试。

docker history api:1.0 --format '{{.Size}} {{.CreatedBy}}' | head -10
docker run --rm api:1.0 du -sh /var/lib/apt/lists
RUN apt-get update && apt-get install -y build-essential && rm -rf /var/lib/apt/lists/*

「镜像层未清理」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。

报错里带路径的,先去看那个路径在不在、权限对不对。同一份配置存在多处的,先确认改的是被加载的那一份。

新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

处理上按这个顺序:把安装和清理写进同一条 RUN 用 && 连起来;装完立刻删掉 /var/lib/apt/lists 和下载的 deb 包;编译工具放在构建阶段 运行阶段只拷产物;用 docker history 看哪一层最大 针对性处理。

结果对不对很好判断,history 里最大那层体积下降,最终镜像少了 400MB 以上。

作者 9823189