

Dockerで devicemapper: Thin Pool has ... free data blocks エラーが出た
この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。
何が起きたか
Dockerでコンテナを作ろうとしたら以下のエラーで失敗した。
ERROR: Preparation failed: Error response from daemon: devmapper: Thin Pool has 161740 free data blocks which is less than minimum required 163840 free data blocks. Create more free space in thin pool or use dm.min_free_space option to change behaviorWill be retried in 3s ...dfで見る限りディスク自体には余裕がある。でもこれはホストのディスク容量の話ではなく、devicemapperのthin pool側の空きブロックが足りていないという話だった。
対処
止まっている未使用コンテナを削除する。
docker rm $(docker ps -aq)稼働中のコンテナが残っていると失敗するので、その場合は先に止めるか対象を絞る必要がある。
続けて未使用イメージも削除する。
docker rmi $(docker images -q)参照中のイメージがあると削除できないので、コンテナ削除を先にやっておいた方が通りやすい。
それでも改善しない場合、稼働中コンテナ内の未使用データブロックをfstrimで解放する。事前にdocker ps -qでコンテナが存在することを確認してから実行する。
sudo sh -c "docker ps -q | xargs docker inspect --format='{{ .State.Pid }}' | xargs -IZ fstrim /proc/Z/root/"コンテナが1つも無い状態で実行すると空振りするので、その場合はやらなくていい。
分かったこと
- devicemapper (thin pool) を使っているとこの容量不足エラーがよく起きるらしい。当時Dockerのデフォルトストレージドライバがdevicemapperだった環境ではよくある話のようだ。
- ディスクの空き容量とthin poolの空きブロックは別物として見る必要がある。
- 今回の対処はあくまで一時しのぎで、根本的にはthin poolのサイズ拡張か、overlay2への移行が必要になりそう。overlay2への移行は実機では未確認。