Docker for Mac の仮想マシンのディスクが壊れたときの対処方法
Docker for Mac の仮想マシン Linux のディスクが壊れてしまったときの対処方法についてです。
結論から言うと、トラブルシュートの「 Clean / Purge data 」を実行すれば OK です(ただし、ボリュームなどがすべて削除されてしまうので、削除されると困るボリュームがある場合は事前にバックアップを取って事後にリストアする等の対応が必要です)。
動作確認バージョン
- Docker for Mac: 4.1.1 (69879)
- Docker Engine: 20.10.8
問題
どんなことがきっかけでディスクが壊れるのかはよくわかりませんが、ディスクが壊れると本来成功するはずの処理が失敗するようになったりします。
私の場合は、コマンド docker system df
が「 error getting build cache usage 」「 failed to get usage for ... 」「 stat ... no such file or directory 」というエラーで実行できなくなりました。
docker system df
Error response from daemon:
error getting build cache usage:
failed to get usage for 4n4cdyzv2uy877hcxx29nf4ii:
stat /var/lib/docker/overlay2/7sf5wsiqcoywnde3qlieol7gx: no such file or directory
(見やすく改行を加えています)
Docker が存在すると考えているビルドキャッシュファイルの実体が見つからずにエラーになっています。 これに加えて、私の場合は次のような現象も発生しました。
- Docker for Mac ダッシュボードの Images 画面が正しく表示されない
- 一部のイメージのビルドができない
ビルドキャッシュに問題があるとのことなので、次のような感じでイメージとビルドキャッシュをすべて削除したりもしてみましたが、これでは解決しませんでした。
# すべてのイメージを削除後、すべてのビルドキャッシュを削除 → 解決せず……
docker images | xargs docker image rm
docker buildx prune
解決方法
冒頭にも述べたとおり、(私の場合は) Docker for Mac の Troubleshoot から「 Clean / Purge data 」を実行すると OK でした。
「 Clean / Purge data 」については Docker for Mac の UI 上で次のように説明されています:
This will solve problems with disk corruption, Docker Engine not booting...
なお、「 Clean / Purge data 」を行うとマシン上に存在するすべてのイメージとボリュームが削除されてしまうため注意が必要です。 一般にイメージの方は削除されてもさほど問題にはなりませんがボリュームは思わず削除されると困ることがあるので、「 Clean / Purge data 」を行う際は、事前に削除されると困るボリュームが無いか確認して、削除されると困るボリュームは事前にバックアップして事後にリストアするのがよいかと思います。
ちなみに、私は万が一確認モレがあると怖い & マシンのディスクスペースに余裕があったので、すべてのボリュームをバックアップして事後にリストアする形で対応しました。
私がボリュームのバックアップ(=ホストの macOS へのコピー)に使用したスクリプトに少し調整を加えたものを GitHub に置いたので、興味のある方は参考にしてみてください。
ということで、Docker for Mac の仮想マシン Linux のディスクが壊れてしまったときの対処方法についてでした。
途中に繰り返し「私の場合は」と書いているとおり、これはあくまでも私の場合に有効だった方法です。 参考にされる際はその点にご注意ください。