“no space left on device”错误源于/var/lib/docker所在分区空间或inode耗尽,需先用df -h和df -i定位瓶颈,再执行docker system prune等命令清理无用资源,最后可迁移data-root至大容量分区实现长期解决。

遇到“no space left on device”报错,说明 Docker 默认存储路径(通常是 /var/lib/docker)所在分区已满或 inode 耗尽。清理不是只删几个镜像就行,得按层次排查和处理:先确认瓶颈在哪,再针对性释放,最后考虑长期规避。
先查清到底是空间还是 inode 不足
很多情况下磁盘显示还有 10% 剩余,却仍报错——很可能是 inode 耗尽(尤其在频繁构建、产生大量小层的 PyTorch/CUDA 环境中):
- 查磁盘使用:df -h /var/lib/docker —— 关注 Use% 是否 ≥95%
- 查 inode 使用:df -i /var/lib/docker —— 若 IUse% 接近 100%,说明有海量小文件(如构建缓存层、悬空镜像),需重点清理
快速释放:用 prune 系列命令精准清理
不推荐手动逐个 docker rmi,容易漏掉构建缓存、停止容器、未挂载卷等隐藏占用:
- 清理停止的容器、悬空镜像、未用网络:docker system prune(交互式,安全)
- 连带删除所有未被容器引用的镜像(含带 tag 的旧版本):docker system prune -a
- 额外清理未挂载的数据卷(谨慎!确认无重要数据):docker system prune -a --volumes
- 单独清理构建缓存(对频繁 build 的用户特别有效):docker builder prune
深度清理:识别并清除“幽灵资源”
prune 可能漏掉部分残留,尤其当镜像被多次重打但未显式删除旧版时:
- 列出所有镜像(含
: ):docker images -a - 强制删掉所有无标签镜像:docker rmi $(docker images -f "dangling=true" -q)
- 删掉所有已退出容器:docker rm $(docker ps -aq -f status=exited)
- 删掉所有未挂载卷:docker volume prune
长期方案:迁移 Docker 根目录到大容量分区
如果宿主机有其他大磁盘(如 /data 或 /mnt),建议一劳永逸迁移:
- 停服务:systemctl stop docker
- 新建目标目录:mkdir -p /data/docker
- 迁移数据:rsync -avz /var/lib/docker/ /data/docker/
- 修改配置:echo '{"data-root":"/data/docker"}' > /etc/docker/daemon.json
- 重载并重启:systemctl daemon-reload && systemctl start docker
- 验证:docker info | grep "Docker Root Dir" 应显示新路径
- 确认无误后,再删旧目录:rm -rf /var/lib/docker











