问题描述
在使用 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
分区,可以避免根分区空间不足的问题。 - 如果需要更多空间,可以考虑扩展根分区的大小。