今天在 Linux 服务器上通过 Docker 构建 Spring Boot 项目镜像时,突然遇到如下错误:
Error processing tar file(exit status 1): write /tmp/db.amd64.deb: no space left on device
明明没有进行大文件操作,服务器却突然提示磁盘空间不足。通过 df -h
命令检查系统磁盘,发现根分区(/
)已被占满:
Filesystem Size Used Avail Use% Mounted on/dev/vda1 200G 195G 0G 100% /
初步怀疑是 Docker 相关缓存占用了大量空间。
定位问题
通过 Docker 自带的磁盘分析命令查看资源占用:
$ docker system dfTYPE TOTAL ACTIVE SIZE RECLAIMABLEImages 45 6 99.35GB 74.17GB (74%)Containers 10 6 27.06GB 6.004GB (22%)Local Volumes 7 1 0B 0BBuild Cache 414 0 41.58GB 41.58GB ✅ 重点!
关键发现:
- 构建缓存(Build Cache) 占用了 41.58GB,且全部为可回收状态(
RECLAIMABLE
显示41.58GB
)。 - 这些缓存来自历史构建产生的中间镜像层,长期未清理导致空间耗尽。
解决方案
执行 Docker 官方提供的缓存清理命令:
# 强制删除所有未使用的构建缓存(无需手动确认)$ sudo docker builder prune -fWARNING! This will remove all build cache not used by at least one container.Are you sure you want to continue? [y/N] # 输入 y 或直接回车(-f 选项会自动确认)Deleted builds: 318
清理后验证
再次查看 Docker 存储占用:
$ docker system dfTYPE TOTAL ACTIVE SIZE RECLAIMABLEImages 25 6 99.35GB 74.17GB (74%)Containers 8 6 27.06GB 6.004GB (22%)Local Volumes 3 1 0B 0BBuild Cache 96 0 0B 0B ✅ 已清空!
同时检查系统磁盘空间,根分区已释放 41GB+ 空间:
Filesystem Size Used Avail Use% Mounted on/dev/vda1 200G 153G 47G 77% / # 空间恢复正常
此时重新执行 Docker 构建命令,项目镜像成功生成,问题解决。
最佳实践
下面是我在处理类似问题时的一些最佳实践,帮助避免未来再次出现 "no space left on device" 错误:
定期自动化清理
在服务器中添加定时任务(crontab
),每周自动清理 Docker 缓存:0 0 * * 0 sudo docker builder prune -f && sudo docker system prune -af启用 BuildKit 优化缓存
在构建时开启 Docker 新一代构建引擎 BuildKit,提升缓存利用率:export DOCKER_BUILDKIT=1docker build -t myapp:latest .精细化管理镜像与容器
- 用
docker image prune -a
清理孤立镜像 - 用
docker container prune
移除停止的容器 - 对重要镜像添加标签(如
latest
、v1.0
),避免冗余版本堆积
- 用
总结
当 Docker 出现 "no space left on device" 错误时,构建缓存膨胀 是最常见原因之一。通过 docker builder prune
命令可快速释放空间,结合定期维护机制能有效预防同类问题。如果清理后空间仍不足,可进一步检查 Docker 数据目录(默认 /var/lib/docker
)或宿主机其他大文件占用。