根据错误信息 write /var/lib/docker/tmp/...: no space left on device
,问题的根源是 根分区(/)的磁盘空间不足,而非 /home
分区的问题。以下是详细解释和解决方案:
问题原因分析
-
Docker 临时文件占用根分区空间:
docker save
命令在导出镜像时,会先将镜像数据暂存到/var/lib/docker/tmp
目录(属于根分区/
)。- 即使你的目标路径
/home
有 2TB 空间,但临时文件的写入路径/var/lib/docker/tmp
所在的根分区空间不足,导出操作仍会失败。
-
根分区空间不足:
- 根据之前的
df -h
输出:
根分区只剩 5.8G 空间,远小于需要导出的镜像大小(21.3GB),导致临时文件无法写入。/dev/mapper/openeuler-root 69G 60G 5.8G 92% /
- 根据之前的
解决方案
方法:迁移 Docker 数据目录到 /home
如果根分区空间无法释放足够空间,必须将 Docker 数据目录迁移到 /home
分区,这样 docker save
的临时文件也会在 /home
下生成。
步骤如下:
-
停止 Docker 服务:
sudo systemctl stop docker
-
创建新数据目录(如
/home/docker
):sudo mkdir -p /home/docker sudo chown -R root:root /home/docker
-
迁移现有数据:
# 将旧数据复制到新目录(可能需要时间) sudo rsync -avz /var/lib/docker/ /home/docker/
-
配置 Docker 使用新目录:
# 创建 Docker 守护进程配置文件 sudo mkdir -p /etc/systemd/system/docker.service.d/ sudo tee /etc/systemd/system/docker.service.d/devicemapper.conf <<EOF [Service] ExecStart= ExecStart=/usr/bin/dockerd --graph=/home/docker EOF
-
重启 Docker 服务:
sudo systemctl daemon-reload sudo systemctl start docker sudo systemctl enable docker
注意:启动docker出现了个错误
解决方法:
sudo vim /etc/systemd/system/docker.service.d/devicemapper.conf
修改前的错误配置:
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --graph=/home/docker
修改后的正确配置:
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --data-root=/home/docker
重启
sudo systemctl daemon-reload
sudo systemctl restart docker
确认 Docker 数据目录已正确指向 /home/docker:
sudo docker info | grep "Docker Root Dir"
输出应为:Docker Root Dir: /home/docker
- 删除旧数据(可选):
sudo rm -rf /var/lib/docker
注意事项
-
临时文件空间需求:
docker save
需要额外的临时空间,因此即使/home
有 2TB,根分区仍需至少 镜像大小的 1.5 倍 空间(如果未迁移数据目录)。
-
迁移后的路径权限:
- 确保
/home/docker
的权限正确:sudo chown -R root:root /home/docker sudo chmod 755 /home/docker
- 确保
-
日志文件清理:
- 如果容器日志占用空间,可以清理日志:
# 清理所有容器日志 sudo find /var/lib/docker/containers/ -name "*.log" -exec truncate -s 0 {} \;
- 如果容器日志占用空间,可以清理日志:
验证操作成功
-
检查根分区空间:
df -h / # 确保根分区使用率 < 90%
-
我重新尝试导出:
docker save -o /home/mis-tei-6.0.0-300I-Duo-aarch64.tar swr.cn-south-1.myhuaweicloud.com/ascendhub/mis-tei:6.0.0-300I-Duo-aarch64
成功
总结
- 根本原因:
/var/lib/docker/tmp
所在的根分区空间不足。 - 解决方案:清理根分区或迁移 Docker 数据目录到
/home
。 - 长期建议:定期清理 Docker 资源,并监控磁盘使用情况。
如果问题仍未解决,请提供更多以下信息:
docker system df
输出(查看镜像占用情况)。df -h /var/lib/docker
(确认数据目录空间)。- Docker 版本:
docker --version
。