摘自: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 | # 如果 inode 已经 100%,执行此步可能无法正常进行 |
进入到对应目录下,清空目录下 Docker 缓存文件:
1 | cd /var/lib/docker/overlay2/ |
重置 Docker 环境配置:
1 | docker system prune -a |
