Docker: no space left on device

前言

最近在 build docker image 的時候遇到 No space left on device 的問題
因為在解的過程發現好像蠻多人都有遇過這個問題,於是就把解的過程記錄下來,希望能幫到其他人


今天在 build docker image 的時候出現這個錯誤

1
ERROR: Could not install packages due to an EnvironmentError: [Errno 28] No space left on device

因為是死在 pip install 這關,所以一開始先往 pip 的方向去找找到了以下這篇

[Errno 28] No space left on device #5816

裡面看起來是在說當不是用 root 安裝時,會遇到 tmp 資料夾空間不足的問題,裡面大概提供了兩種解法:

  1. 在家目錄底下開一個新的 tmp 資料夾,然後讓系統使用該資料夾來解決 tmp 空間不足的問題
  2. pip install –no-cache-dir

最後覺得第一個太麻煩了(因為我是在 docker 裡面),所以選第二個

但是問題沒解決,接著只把這段再加上 docker 拿去餵狗

1
No space left on device

接著看到好像真的是 docker 的問題,因為蠻多人都遇過的

看起來是因為 docker 會先配置一些空間用來暫存資料,然後這個空間被塞爆後就會報這個錯誤

於是我看了這篇

Docker error : no space left on device

然後先試了

1
2
3
4
5
6
7
> docker system prune
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all dangling images
- all dangling build cache
Are you sure you want to continue? [y/N]

可以從輸入後的結果來看到這個指令將會刪除

  • all stopped containers
  • all networks not used by at least one container
  • all dangling images
  • all dangling build cache

如果上面這些東西還有要用的話這條路可能就行不通

總之我執行了之後空間好像還是不夠

接著照著這篇

https://success.docker.com/article/no-space-left-on-device-error

  1. 先找出哪些 container 的 log 檔最大

    1
    du -d1 -h /var/lib/docker/containers | sort -h

    大概會看到這種東西

    1
    2
    3
    4
    5
    6
    7
    8
    9
    36K	/var/lib/docker/containers/46d7350f4e7cd7c5c473ace07a58b74e20cb2edff7c2484c5a6e547f86ce17f3
    40K /var/lib/docker/containers/c88c6163611685271f853a130a411cb497faf232741a9266afe9534b43b7f9c9
    44K /var/lib/docker/containers/0819596cafb92e67b1f24890e6a19b91e1aad2ed77aba6a21e785d7f5d8319d1
    44K /var/lib/docker/containers/137ac90cc4d23fdbfc02231edb6224dee1f9e5c088ad9245b8b0909f9b7ae74c
    116K /var/lib/docker/containers/2384b475573521048658e4ef91f61ec3ef96d151ca9fab9acf751a74ae7bc8e3
    148K /var/lib/docker/containers/ea1cf3adba3d5f2451486f826cb3c24e9e443d719bbda2af7fe51de6a5597b74
    340K /var/lib/docker/containers/d920fa2ff4455d50d75e40fbce1fd8414b84b32f272718fc83abfd707bbcebd5
    668K /var/lib/docker/containers/8eec417b6620ff884f0a8777a0e22d70ef8560af888859bbb154db54e21b26ad
    166M /var/lib/docker/containers/ad0f644b4b97f93ca6fbfc367ee42780b2bd8bd056fb8457b922df7cf3e996f8
  2. 找出最佔空間的 log 檔,然後搭配

    1
    docker ps

    確定是哪個 container 的 log 檔且確定不需要了之後執行以下指令來清除 log 檔

    1
    cat /dev/null > /var/lib/docker/containers/<container_id>/<container_log_name>

    如果權限不足的話可能要用以下指令

    1
    sudo sh -c "cat /dev/null > /var/lib/docker/containers/<container_id>/<container_log_name>"

    刪完後再執行一次以下指令確認 log 檔已經被刪除

    1
    du -d1 -h /var/lib/docker/containers | sort -h

然後…還是失敗,於是決定換個思路

1
df

結果原來是 ubuntu 的空間快被吃光了..

然後照著這篇做

7 Simple Ways to Free Up Space on Ubuntu and Linux Mint

  1. 先清 apt

    1
    2
    sudo apt-get autoremove
    sudo apt-get autoclean
  2. 接著清 log

    1
    2
    3
    4
    5
    # 看 log 檔佔多少空間
    journalctl --disk-usage

    # 刪除超過三天的 log 檔
    sudo journalctl --vacuum-time=3d

再 build 一次就成功了QQ


參考資料