今天在 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 df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 45 6 99.35GB 74.17GB (74%)
Containers 10 6 27.06GB 6.004GB (22%)
Local Volumes 7 1 0B 0B
Build Cache 414 0 41.58GB 41.58GB ✅ 重点!

关键发现

  • 构建缓存(Build Cache) 占用了 41.58GB,且全部为可回收状态(RECLAIMABLE 显示 41.58GB)。
  • 这些缓存来自历史构建产生的中间镜像层,长期未清理导致空间耗尽。

解决方案

执行 Docker 官方提供的缓存清理命令:

# 强制删除所有未使用的构建缓存(无需手动确认)
$ sudo docker builder prune -f
WARNING! 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 df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 25 6 99.35GB 74.17GB (74%)
Containers 8 6 27.06GB 6.004GB (22%)
Local Volumes 3 1 0B 0B
Build 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" 错误:

  1. 定期自动化清理
    在服务器中添加定时任务(crontab),每周自动清理 Docker 缓存:

    0 0 * * 0 sudo docker builder prune -f && sudo docker system prune -af
  2. 启用 BuildKit 优化缓存
    在构建时开启 Docker 新一代构建引擎 BuildKit,提升缓存利用率:

    export DOCKER_BUILDKIT=1
    docker build -t myapp:latest .
  3. 精细化管理镜像与容器

    • docker image prune -a 清理孤立镜像
    • docker container prune 移除停止的容器
    • 对重要镜像添加标签(如 latestv1.0),避免冗余版本堆积

总结

当 Docker 出现 "no space left on device" 错误时,构建缓存膨胀 是最常见原因之一。通过 docker builder prune 命令可快速释放空间,结合定期维护机制能有效预防同类问题。如果清理后空间仍不足,可进一步检查 Docker 数据目录(默认 /var/lib/docker)或宿主机其他大文件占用。