要点
- Docker for Macを使うなら、定期的にdisk imageをお掃除してあげるべし
背景
Docker for Macで開発しているとあるScalaアプリで、下記のようなエラーが出た
java.io.IOException: No space left on device
あっれー?そんなにdisk使ってたかなーと思って df -h
コマンドを叩いたけどdiskには全然余裕がある。dockerでdisk使用量のquotaとか設定してたかな?と思ってPreferencesを開いて思い出した。
Docker for Macはイメージをbuildすると残りかすがちょっとづつ溜まっていくので、定期的にdisk imageをお掃除する必要がある。
( docker images prune
の話じゃないよ! )
Disk image?
ここでいうdisk imageとはdocker imageの話ではなく、文字通りDocker for Macがdocker imageを管理するためのファイルのこと。disk imageにdocker imageがたくさん詰まってる感じ。
PreferencesのDiskタブでUsageを確認できる。自分の環境の場合64GB割当で62.5GB使用中 = 使用率97%。やっぱりこれだわ〜〜〜。
ls等のコマンドでもdisk imageファイルの存在を確認出来る。割当サイズ分を最初にガツッと確保するスタイルらしいので、実際に何%ぐらい使っているかは上記の画面で確認すべし。
$ ls -alh /Users/pinkumohikan/Library/Containers/com.docker.docker/Data/vms/0/Docker.raw -rw-r--r-- 1 pinkumohikan staff 60G 8 23 01:17 /Users/pinkumohikan/Library/Containers/com.docker.docker/Data/vms/0/Docker.raw
余談: 昔はqcow2っていうフォーマットだったけど、最近はrawらしい。
Qcow2 or Raw?
Starting with High Sierra with Apple Filesystem (APFS) enabled, Docker uses disk images in the “raw” format (Docker.raw), otherwise in the Qcow2 format (Docker.qcow2).
対処法はdisk imageのリセット
PreferencesのResetタブにある、 Reset disk image
ってやつ。
これを実行するとdocker imagesがまるっと消えるので次にdocker runやbuildしたときにbase imageのpullから始まる。出先等のインターネットが弱い場所や、急いでコンテナを立ち上げる必要があるときにはやらないほうが良い。
きれいさっぱり
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES $ docker images -a REPOSITORY TAG IMAGE ID CREATED SIZE
地味なトラップでした。