摘自: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 是文件系统中的一个重要概念,它为文件和目录的管理提供了基础,使得文件系统能够高效地管理和存储文件和目录。

查看 inodes 使用情况:

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