彻底根治 Docker 镜像缓存残留需“删得准、分得清、控得住”,按悬空镜像、未引用带标签镜像、构建缓存三类分级清理,配合 --filter 精准过滤和 daemon.json 配置限制缓存大小与日志轮转。
彻底根治 Docker 镜像缓存残留,关键不是“删得狠”,而是“删得准、分得清、控得住”。系统级清理工具本身不自动识别业务逻辑,必须配合分层策略和运行状态判断,才能避免误删共享层或破坏正在构建的镜像依赖。
Docker 的缓存残留主要分三类,每类清理逻辑不同:
<none>,常见于重复 docker build -t app:latest 或 docker pull 后旧层失标。这类可安全批量清除。nginx:1.25 已拉取但从未运行过容器,或容器已删而镜像仍留。它占空间却不提供服务,是重点清理对象。/var/lib/docker/buildkit/cache。中断构建(如 Ctrl+C)后极易残留,且不显示在 docker images 中。别一上来就 system prune -a。从低风险起步,逐级释放:
docker image prune -f
docker image prune -a -f
docker builder prune -f;加 -a 可清全部缓存层docker system prune -f
注意:docker system prune -a --volumes 会删未挂载卷,生产环境禁用——除非你确认卷里没数据库快照、日志归档等业务数据。
多项目共存或 CI/CD 环境下,全局清理太粗暴。用 --filter 锁定范围:
docker image prune -f --filter "until=72h"
docker image prune -a -f --filter "reference=myapp:*"
docker image prune -a -f --filter "reference=redis:7.0" --filter "until=168h"
清理是补救,治理才是根治。两项配置必须做:
"builder": {"gc": {"defaultKeepStorage": "2g"}},重启 Docker 生效。BuildKit 会自动淘汰最久未用缓存。/etc/docker/daemon.json 加入:{"log-driver": "json-file", "log-opts": {"max-size": "10m", "max-file": "3"}}
改完记得 sudo systemctl restart docker。
不复杂但容易忽略。