根據錯誤信息 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
。