ボリューム エラーのトラブルシューティング

このトピックでは、 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 を扱うファイルシステム上で statfsfstatfs を使うと、これらを閉じられなくなります。

通常は、このように /var/lib/doker に対するバインド マウントに反対したいです。しかしながら、 cAdviser は中心となる機能で、このバインドマウントが必要です。

パスが busy であったり削除できないといったエラーを引き起こすとき、どのプロセスが原因か不確かな場合には、 lsof コマンドでプロセスを特定できます。たとえば、先ほどのエラーであれば、次のようにします。

$ sudo lsof /var/lib/docker/containers/74bef250361c7817bee19349c93139621b272bc8f654ae112dd4eb9652af9515/shm

この問題に対処するには、/var/lib/docker をバインド マウントしているコンテナを停止し、他のコンテナの削除を再び試します。