首页/云/Docker 容器速查/no space left on device 定位
容器排障52 条

no space left on device 定位

写不进去分空间与 inode 两类:df -h 看容量、df -i 看 inode;再用 du 从 /var/lib/docker 逐层下钻定位到日志、层或卷。

Docker 容器速查云更新于 2026-10-13

报错的两类原因

容器相关写入报 no space left on device 时,先分清是空间不足还是 inode 耗尽:df -h 看容量,df -i 看 inode 数量。确认类型后从 /var/lib/docker 逐层下钻,用 du 找出究竟是容器日志、镜像层、构建缓存还是数据卷占了空间,再按类型选择对应的清理手段。

基本信息

容量检查df -h /var/lib/docker
inode 检查df -i /var/lib/docker
下钻方式du -x --max-depth=1 逐层定位
常见占用源容器日志、悬空镜像、构建缓存、未使用卷
适用平台Linux 宿主

典型使用场景

  • 服务突然写不进文件,日志报 no space left
  • 数据库容器异常退出,排查发现宿主磁盘已满
  • 部署新镜像失败,本地磁盘没有空间解压层
  • 巡检发现宿主磁盘长期高水位,需要定位大头
  • df -h 还有余量却创建文件失败,实际是 inode 耗尽

定位与清理

定位与清理
df -h /var/lib/docker; df -i /var/lib/docker        # 容量与 inode 一起看
sudo du -x --max-depth=1 /var/lib/docker | sort -h | tail -8
sudo du -sh /var/lib/docker/overlay2 /var/lib/docker/volumes /var/lib/docker/containers 2>/dev/null
du -sh /var/lib/docker/containers/*/*-json.log 2>/dev/null | sort -h | tail -5   # 定位大日志
truncate -s 0 /var/lib/docker/containers/<id>/<id>-json.log   # 已写大的日志用清空方式回收

占用源与清理手段

占用源典型路径清理手段
容器日志containers/<id>/*-json.log配置轮转参数,存量文件用 truncate 清空
镜像层overlay2/删除不用的镜像与悬空镜像
构建缓存builder 相关目录docker builder prune
数据卷volumes/确认无业务数据的卷再执行 volume prune
定位到来源之后再动手:日志问题用轮转参数根治,镜像问题用清理命令回收,卷问题要先确认没有需要保留的数据。
直接删除正在写入的日志文件不会立即释放空间,进程仍持有文件句柄,用 truncate 清空内容才会真正回收。

按来源选择清理手段

  • 容器日志:daemon.json 或运行参数加 max-size 与 max-file,存量文件用 truncate
  • 悬空镜像与未使用镜像:docker image prune 带时间过滤清理
  • 构建缓存:docker builder prune,按保留时间控制
  • 未使用的数据卷:先列清单确认没有业务数据,再做 volume prune
  • 根因治理:把日志轮转与定期清理做成计划任务,避免重复告警
长期方案是给宿主的分区容量与 inode 使用率分别配置监控告警,并在阈值上留出清理动作的时间窗口。

易错点

  • 只跑 df -h 就下结论:inode 耗尽同样报空间不足,必须用 df -i 一起判断
  • 在线上直接删除 /var/lib/docker 下的目录:属事故级操作,会破坏镜像与容器元数据,清理应走 docker 命令
  • 只清一次不配置轮转:几天后磁盘会再次被日志填满,属于重复故障
  • 用 rm 删除正在写入的大日志:空间不释放,还可能让写入方报错

数据来源与参考

  • Docker 官方文档:Troubleshoot storage(docs.docker.com)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌