ボリューム エラーのトラブルシューティング¶
このトピックでは、 Docker ボリュームやバインドマウントの使用時に発生する可能性があるエラーについて扱います。
Error: Unable to remove filesystem
(エラー:ファイルシステムを削除できない)¶
Google cAdvisor のような、コンテナをベースとしたツールのいくつかは、 /var/lib/docker
のような Docker システムディレクトリをマウントします。たとえば、 cadvisor
のドキュメントには、 cadvisor
コンテナを次のように実行するような手順があります。
$ sudo docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:rw \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
google/cadvisor:latest
/var/lib/docker
のバインド マウントは、実行中の他すべてのコンテナが持つ、全てのリソースをマウントするのに効果的です。これは /var/lib/docker
をコンテナ内のファイルシステムとしてマウントするからです。これらをコンテナから削除しようとしても、以下のようなエラーが発生し、削除は阻止されます。
Error: Unable to remove filesystem for
74bef250361c7817bee19349c93139621b272bc8f654ae112dd4eb9652af9515:
remove /var/lib/docker/containers/74bef250361c7817bee19349c93139621b272bc8f654ae112dd4eb9652af9515/shm:
Device or resource busy
問題が起こるのは、コンテナが /var/lib/docker
をマウントするとき、 /var/lib/docker
を扱うファイルシステム上で statfs
や fstatfs
を使うと、これらを閉じられなくなります。
通常は、このように /var/lib/doker
に対するバインド マウントに反対したいです。しかしながら、 cAdviser
は中心となる機能で、このバインドマウントが必要です。
パスが busy であったり削除できないといったエラーを引き起こすとき、どのプロセスが原因か不確かな場合には、 lsof
コマンドでプロセスを特定できます。たとえば、先ほどのエラーであれば、次のようにします。
$ sudo lsof /var/lib/docker/containers/74bef250361c7817bee19349c93139621b272bc8f654ae112dd4eb9652af9515/shm
この問題に対処するには、/var/lib/docker
をバインド マウントしているコンテナを停止し、他のコンテナの削除を再び試します。
参考
- Troubleshoot volume errors
https://docs.docker.com/storage/troubleshooting_volume_errors/