docker-compose buildが突然失敗するようになった原因

# はじめに
右も左もわからないプログラミング初心者が書く備忘録です。
膨大な勉強量の中で気になった事をメモしていきます。

# 今回の内容
普段からDocker環境で制作を行っているのですが、突然　build　が出来なくなるエラーに遭遇しました。
Dockerを使い始める時に気にはしていたのですが、ここに来て解消方法がわかったのでメモしておきます

# 開発環境
Rails 6.1.3.2
ruby 2.5.1
Docker version 20.10.6

# 原因

:::note alert
docker imagesによるホストディスク容量の圧迫
:::

# 解決方法

:::note 
docker system prune
:::

https://docs.docker.jp/config/pruning.html


# 詳細
docker-compose buildした際のエラー文

```
$ docker-compose build

               ・
               ・
               ・
 Fetching sassc 2.4.0
 Installing sassc 2.4.0 with native extensions
 Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
 
     current directory: /usr/local/bundle/gems/sassc-2.4.0/ext
 /usr/local/bin/ruby -I /usr/local/lib/ruby/2.7.0 -r
 ./siteconf　.rb extconf.rb
 creating Makefile
 
 current directory: /usr/local/bundle/gems/sassc-2.4.0/ext
 make "DESTDIR=" clean
 
 current directory: /usr/local/bundle/gems/sassc-2.4.0/ext
 make "DESTDIR="
               ・
               ・
               ・
 ./libsass/src/・・・: fatal error: error writing to /tmp/ファイル名:
 No space left on device
  }
  ^
 compilation terminated.
 make: *** [Makefile:237: ・・・] Error 1
 
 make failed, exit code 2
 
 Gem files will remain installed in /usr/local/bundle/gems/sassc-2.4.0 for
 inspection.
 Results logged to
 /usr/local/bundle/extensions/x86_64-linux/2.7.0/sassc-2.4.0/gem_make.out
 
 An error occurred while installing sassc (2.4.0), and Bundler cannot continue.
 Make sure that `gem install sassc -v '2.4.0' --source 'https://rubygems.org/'`
 succeeds before bundling.
 
 In Gemfile:
   sass-rails was resolved to 6.0.0, which depends on
     sassc-rails was resolved to 2.1.2, which depends on
       sassc
------
executor failed running [/bin/sh -c bundle config --local set path 'vendor/bundle'   && bundle install]: exit code: 5
ERROR: Service 'web' failed to build : Build failed
```

注目したのはここと

```
# native extensionがinstallできませんでしたよ〜
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
```

ここ

```
# お使いのデバイスにスペースがありませんよ〜
 fatal error: error writing to /tmp/ファイル名:
 No space left on device
```

ということで何が容量を埋め尽くしているのかを見てみます

```
$ docker system df

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          49        0         49.74GB   49.74GB (100%)
Containers      0         0         0B        0B
Local Volumes   26        0         1.216GB   1.216GB (100%)
Build Cache     203       0         3.866GB   3.866GB
```

```
$ docker images

REPOSITORY                          TAG       IMAGE ID       CREATED        SIZE
アプリ名                    　　　　　　　　　　　　　　　　　　 latest                   8 hours ago    3.5GB
<none>                              <none>    5fb9f473d4c8   5 days ago     2.98GB
<none>                              <none>    187b8bedc8e6   7 days ago     2.86GB
<none>                              <none>    ddfdc3540057   7 days ago     2.8GB
<none>                              <none>    58bc9d0e3d4e   7 days ago     2.8GB
<none>                              <none>    79681fda5f2b   7 days ago     2.79GB
<none>                              <none>    77d61e5e8b30   7 days ago     2.79GB
<none>                              <none>    54863d6618a9   8 days ago     2.78GB
<none>                              <none>    d2fdbf6c5f00   8 days ago     2.79GB
<none>                              <none>    1fbf0779792e   8 days ago     2.77GB
<none>                              <none>    c13b041c6489   8 days ago     2.77GB
<none>                              <none>    1868c1cf1de9   9 days ago     2.68GB
<none>                              <none>    8d9d14f39e2f   11 days ago    2.6GB
<none>                              <none>    979159b2f6ed   11 days ago    2.55GB
<none>                              <none>    5c7c059ee128   2 weeks ago    2.37GB
<none>                              <none>    3353f7b8bdfc   2 weeks ago    2.36GB
```

今までの蓄積に加え、設定に手こずり何度もbuildしたおかげでimagesが膨大になっております。。。
簡単に言えばimagesを全消去すれば良いのですがそんなわけにもいかず

### 「使用していないデータだけ削除したい」

そこでdocker-docsに教えて頂いた prune というコマンドを使ってみます

```
$ docker image prune

WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y  # y を打ち Enter 
                 ・
                 ・
                 ・
Total reclaimed space: 112.4MB
```

え。。。１１２MBしか増えてない:sweat_smile:

もう一度確認してみると

```
$ docker system df

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          7         0         6.264GB   6.264GB (100%)
Containers      0         0         0B        0B
Local Volumes   26        0         1.216GB   1.216GB (100%)
Build Cache     203       0         47.23GB   47.23GB
```

大半が Build Cache へ移行したので、ホストのディスク容量の変化が少なかったみたいです

なのでimagesに絞らずBuild Cacheを含め、イメージ、コンテナ、ネットワーク全てを対象にpluneします

```
$ 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] y　 # y を打ち Enter 
                

Deleted build cache objects:
            ・
            ・
            ・
Total reclaimed space: 47.23GB
```

```
docker system df

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          7         0         6.264GB   6.264GB (100%)
Containers      0         0         0B        0B
Local Volumes   26        0         1.216GB   1.216GB (100%)
Build Cache     32        0         0B        0B
```

これでホストのディスク容量も復活し、無事にbuildすることができました:thumbsup:


ちなみにvolumeも対象にしたい場合は

>Docker 17.06.1 以降では、 docker system prune でボリュームも削除するには --volumes

# ~ 補足 ~
下記リンクへ移動しました！

https://qiita.com/daisuke114/items/5ed2d43b532ed545dc24

# 最後に
勉強を始めたばかりで知識もなく、拙い文章ですがアウトプットすることで頭の中を整理しつつ、どなたかのお役に立てれば良いなと思い投稿させて頂きました。
最後まで見て頂きありがとうございました！