Palmsonntagmorgen

NGSデータを使った解析と、その周辺。

Docker daemonが ルートディレクトリの容量を圧迫するのを回避する

Dockerのイメージを大量にビルドなどしていると、気づくとルート(/)の容量がいっぱいになっていることがあります。

$ df -h
ファイルシス          サイズ  使用  残り 使用% マウント位置
udev                    126G     0  126G    0% /dev
tmpfs                    26G  2.5M   26G    1% /run
/dev/sda3               275G  273G     0  100% /    ←100%になっている

フォルダ容量を調べてみると、 /var/lib/docker/overlay2 が大きく容量を取っていることがわかります。

/var/lib/docker# du -sh *
88K     buildkit
120K    containers
266M    image
64K     network
211G    overlay2
16K     plugins
4.0K    runtimes
4.0K    swarm
4.0K    tmp
4.0K    trust
28K     volumes

既存のイメージを削除していく方法はいくつか見つけました。

dockerで/var/lib/docker/overlay2 が肥大化した時の対処 - 1 Minute Tech Tips

/var/lib/docker/overlay2のストレージ肥大化対応 - /home/jiro4989

ここでは /var/lib/docker/overlay2 の容量を確保し、いくらdocker buildしても大丈夫な環境を構築したいと思います。

物理パーテションには空きはないので、ルートパーテションを確保するにはOSの再インストールから行わないといけません。それはやりたくない。 そこで、容量に余裕がある他のディレクトリ(ここではホームディレクトリ (/home/rnakato)とする)にディレクトリを移動し、そこにリンクを貼るやり方を試してみます。

# systemctl stop docker
# mv /var/lib/docker/overlay2  /home/rnakato/var_lib_docker_overlay2/
# ln -s /home/rnakato/var_lib_docker_overlay2/  /var/lib/docker/overlay2
# systemctl start docker

しかしこの方法だとうまくいきません。docker buildを使うと以下のようなエラーが出ます。 どうやらシンボリックリンクディレクトリだとdocker は動作しないようです。

failed to create shim: OCI runtime create failed: runc create failed: invalid rootfs: not an absolute path, or a symlink: unknown

Docker 'is not an absolute path or is a symlink' error - Stack Overflow

そこで、ホームディレクトリに新しく作ったディレクトリを mount コマンドでbindしてみることにします。

# systemctl stop docker
# mv /var/lib/docker/overlay2  /home/rnakato/var_lib_docker_overlay2/
# mkdir  /var/lib/docker/overlay2
# mount --bind  /home/rnakato/var_lib_docker_overlay2/  /var/lib/docker/overlay2
# systemctl start docker

Dockerの/var/lib/dockerを移動する - Qiita

この方法だとうまくいきました。

$ df -h
ファイルシス          サイズ  使用  残り 使用% マウント位置
udev                    126G     0  126G    0% /dev
tmpfs                    26G  2.6M   26G    1% /run
/dev/sda3               275G   63G  199G   24% /