问题描述
在使用 Docker 构建镜像时,遇到了以下错误:
ERROR: failed to solve: failed to copy: write /var/lib/docker/buildkit/...: no space left on device同时通过 free -h 命令查看系统内存和交换空间发现它们都很充足,因此疑惑为何会出现 "no space left on device" 的错误。
问题原因
该错误与内存无关,而是由于 磁盘空间 不足导致的。使用 df -h 命令检查磁盘的使用情况可以看到,根分区 (/dev/mapper/centos-root) 的空间几乎用尽:
- 根分区 (/) 总共有 50GB,已用 49GB,仅剩 1.2GB,使用率达到了 98%。
Docker 的数据存储位置默认在 /var/lib/docker,该目录位于根分区中。因此,由于根分区空间不足,Docker 无法继续写入数据,导致构建失败。
解决方案
- 
清理根分区中的空间 你需要在根分区中释放一些空间,以确保 Docker 构建有足够的可用磁盘空间。 - 
清理 Docker 缓存: docker system prune -a这个命令会删除所有未使用的容器、镜像、网络和挂载卷。请在确认不需要这些对象时使用。 
- 
删除不必要的日志文件: /var/log目录中可能存储了许多日志文件,这些文件有时会非常大。你可以使用以下命令来查找较大的日志文件:sudo du -sh /var/log/*然后可以删除不需要的日志文件或将其内容清空: sudo truncate -s 0 /var/log/filename.log
- 
清理系统缓存: 使用以下命令来清理 yum或dnf的缓存,释放一些空间:sudo yum clean all
- 
查找其他大文件: 查找根分区中占用大量空间的文件和目录,尝试清理它们: sudo du -sh /* 2>/dev/null | sort -hr | head -n 20这个命令会列出根目录下占用空间最大的 20 个文件或目录,你可以进一步查找并清理不需要的内容。 
 
- 
- 
迁移 Docker 存储位置 由于 /home分区有 20TB 的可用空间,可以考虑将 Docker 数据存储位置迁移到/home分区上。- 
创建一个新的目录用于 Docker 数据存储,例如 /home/docker-data:sudo mkdir /home/docker-data
- 
修改 Docker 配置文件 /etc/docker/daemon.json,设置data-root为新目录:{ "data-root": "/home/docker-data" }
- 
重启 Docker 服务: sudo systemctl restart docker
 
- 
- 
扩展根分区【OPTIONAL】 如果可能,你可以考虑扩展根分区的大小。由于 /home分区有足够多的可用空间,可以缩减/home的大小并增加/的大小。这种方法涉及到重新分区,可能需要重启系统,并有一定风险,因此需要备份重要数据后进行。
- 
使用软链接迁移部分数据 如果不想更改 Docker 的配置文件,可以将 Docker 的数据目录从 /var/lib/docker移动到/home分区,然后创建一个软链接:- 
停止 Docker 服务: sudo systemctl stop docker
- 
移动 Docker 目录: sudo mv /var/lib/docker /home/docker-data
- 
创建软链接: sudo ln -s /home/docker-data /var/lib/docker
- 
重启 Docker 服务: sudo systemctl start docker
 
- 
总结
- 根分区空间不足,需要通过清理日志、删除不必要的文件或清理 Docker 缓存来释放空间。
- 迁移 Docker 的数据存储位置到 /home分区,可以避免根分区空间不足的问题。
- 如果需要更多空间,可以考虑扩展根分区的大小。