摘自:https://blog.csdn.net/weixin_34383474/article/details/121493708

问题现象

使用gitlab runner的打包机器执行命令打包docker镜像时报 "no space left on device" 的错误,无法正确打包。

问题排查步骤

  • 登录打包机查看机器剩余磁盘容量,得到结果物理机磁盘仍有剩余空间。
1
df -h
  • 通过复制文件证明磁盘空间确有剩余,但是在物理机上直接执行docker命令依然存在no space left on device空间不足的报错
  • 通过搜索找到原因服务机inodes使用过高,执行指令得到结果inodes占用100%,原因为docker打包过程中小文件生成过多导致inodes占用过高

inode是什么

inode是文件系统中的一个数据结构,用于存储文件或目录的元数据信息,如文件大小、所属用户、所属组、权限、创建时间、修改时间等等。每个inode都有一个唯一的编号,称为inode号。

当文件或目录被创建时,会分配一个inode号和一定的磁盘空间存储文件内容。文件名与inode号之间建立一个映射关系,通过文件名可以找到对应的inode,然后再根据inode中的元数据信息找到文件的内容。

因为文件名与inode号之间的映射关系是存储在目录中的,所以目录也需要使用inode来存储其元数据信息。一个目录的inode中会包含目录下所有文件的inode号和文件名的对应关系。

总之,inode是文件系统中的一个重要概念,它为文件和目录的管理提供了基础,使得文件系统能够高效地管理和存储文件和目录。

1
df -i
  • 执行命令查找物理机上文件数量较多的文件目录,发现文件集中在/var/lib/docker/overlay2/目录下
1
2
# 如果inode已经100%,执行此步可能无法正常进行
find / -xdev -printf '%h\n' | sort | uniq -c | sort -k 1 -n
  • 进入到对应目录下,清空目录下docker缓存文件
1
2
3
cd /var/lib/docker/overlay2/

ls | xargs rm -rf
  • 重置docker环境配置
1
docker system prune -a