CentOS 7.9 上一台构建机磁盘紧张,docker system df 显示可回收十二 G,执行 docker system prune -a 只释放了两 G,df 看着几乎没动。

一开始怀疑是「卷不在默认清理范围内,加 -a 也不动 volume,需要 –volumes 明确指定」,查了一圈,方向不对。

把日志和配置对完,能解释这个现象的基本就这几处。prune 默认不清理仍被停止容器引用的镜像,容器不删镜像就留着。还有一种是构建缓存要加 –build-cache 或者单独用 builder prune 才会被算进去。

还有一种情况,容器日志属于 /var/lib/docker/containers 下的文件,任何 prune 都不处理。

第一件事是看清四个口径各占多少

docker system df -v | head -30

随后清掉停止的容器和悬空镜像

docker container prune -f && docker image prune -f

单独清构建缓存并给上限

docker builder prune -f --filter until=168h

等前面都确认过,再清理没有被引用的卷

docker volume prune -f --filter label!=keep

改完先别撤,确认这几项。docker system df 里可回收空间降到 1G 以内,df 的根分区使用率下降十个百分点以上,构建仍能正常完成。

这里还有个坑。prune -a 会把暂时没用的镜像一起删,回滚时就得多花时间拉;构建机最好给 builder 设 gc 策略,别靠人工定时清。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189