Docker 构建时 no space left on device(磁盘爆满排查)
问题
执行 docker build 或 docker compose up --build 时失败:
no space left on devicewrite /var/lib/docker/...: no space left on device- 或者拉镜像时卡住/失败
环境
- Linux 主机(Docker 默认数据目录
/var/lib/docker) - 频繁 build、频繁拉镜像、或大量 volumes
原因(常见 3 类)
- 镜像/层缓存太多(build cache、dangling images)
- 容器日志太大(json-file log 不受控)
- volume/数据占用(数据库 volume、缓存 volume)
解决方案(我自己的排查顺序)
1) 先确认到底是谁占满了
看磁盘:
sh
df -h看 docker 占用结构:
sh
docker system df
docker system df -v如果怀疑 Docker 根目录:
sh
sudo du -h -d 1 /var/lib/docker | sort -h2) 清理 build cache / dangling
先保守一点:
sh
docker builder prune更激进(会删除未使用的 build cache):
sh
docker builder prune -a清理未使用镜像/容器/网络(不含 volume):
sh
docker system prune极限清理(包含未使用镜像 + volume,慎用):
sh
docker system prune -a --volumes3) 检查是否是日志把盘打爆了
看单个容器日志大小:
sh
docker ps --format '{{.ID}} {{.Names}}'
sudo du -h /var/lib/docker/containers/*/*-json.log | sort -h | tail如果日志确实过大,先止血(truncate):
sh
sudo truncate -s 0 /var/lib/docker/containers/<container-id>/<container-id>-json.log长期方案:给 docker daemon 配 log rotate(示例):
json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "20m",
"max-file": "5"
}
}位置通常是
/etc/docker/daemon.json,修改后systemctl restart docker。
4) 如果是 volume(数据库)占用
列出 volumes:
sh
docker volume ls
docker volume inspect <name>定位大户(通常是 DB):
sh
docker system df -v | sed -n '1,200p'确认不用了再删(慎用):
sh
docker volume rm <name>验证
df -h可用空间恢复docker build/docker compose up --build能跑通docker system df显示可控(尤其是 build cache 与 volumes)
经验总结
- build cache 是“最容易不知不觉占满”的
- 日志如果不做 rotate,线上/长时间运行很容易爆
- volumes 一删就不可逆:先确认是否包含数据