Docker Desktopを再起動しよう。それだけ。
[症状]
こんな感じでDocker上にNginxとReactアプリとjson-serverを立てて遊んでいたところ、なぜかDockerコンテナを終了できなくなってしまった。
なんらかのnpmモジュールを追加したタイミングだったような気もするが、原因は定かではない。
Dockerコンテナを終了しようとdocker-compose kill
コマンドを実行すると、以下のようにエラーが発生してしまう。
$ docker-compose kill Killing react-on-docker_node_1 ... ERROR: for react-on-docker_node_1 UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=60) ERROR: An HTTP request took too long to complete. Retry with --verbose to obtain debug information. If you encounter this issue regularly because of slow network conditions, consider setting COMPOSE_HTTP_TIMEOUT to a higher value (current value: 60).
コンテナの中に接続して状況を探ることもできない。docker exec
コマンドを実行しようとしても下記のように弾かれてしまう。
$ docker exec -it 6e5bf2fadbab5f4484ca25fe4825ed1d2032e266d30c72846018e39cc4253e3e /bin/sh -c "[ -e /bin/bash ] && /bin/bash || /bin/sh" OCI runtime exec failed: exec failed: cannot exec a container that has stopped: unknown
[対処法]
エラーメッセージでGoogle先生に質問すると、GitHubのIssueが見つかった。
他にも類似のIssueがいくつか存在していたから、割とよく起きる問題ではあるようだ。
Getting UnixHTTPConnectionPool read timeout · Issue #4486 · docker/compose · GitHub
対処法1:COMPOSE_HTTP_TIMEOUTを延長する(効果なし)
エラーメッセージをよくよく読み返してみると、「If you encounter this issue regularly because of slow network conditions, consider setting COMPOSE_HTTP_TIMEOUT to a higher value (current value: 60).」とある。COMPOSE_HTTP_TIMEOUT
の設定を大きい値にすればなんとかなるかもしれないようだ。
それで済むならとexport COMPOSE_HTTP_TIMEOUT=120
と実行し、とりあえず倍の120を指定してみる。
が、結果は同じ。よくみるとエラーメッセージのCOMPOSE_HTTP_TIMEOUT
の現在値の部分が更新されているので、設定は変更できたが効果がないらしい。
念のため、10倍の600を指定して実行してみるもやはり効果がない。ネットワークが遅い場合には効果があるということだが、今回はどうやらそういった原因ではないため、この対処方法ではDockerコンテナを終了することができないらしい。
対処法2:Docker Desktopを再起動する(効果あり)
GitHubのIssueを読みすすめると、Dockerを再起動しても直る、と書かれていた。確かにDockerサービス自体が停止すればその上で動いているコンテナも止まるからこれで良さそうだ。
MacのメニューバーからDocker Desktopのアイコンをクリックしてメニューを表示し、「Restart」をクリックする。
すると、再起動するとコンテナが停止するが問題ないか確認が入る。コンテナを停止したくてDocker Desktopを再起動しているのでなんの問題もない。OKボタンをクリックする。
すると、ステータスの表示がDocker Desktop is starting
と起動中に変わり、しばらくして起動が完了した。
docker psコマンドを実行すると、実行中のコンテナがないことが確認できた。
[まとめ]
- Dockerコンテナを終了できなくなったらDocker Desktopを再起動しよう
大抵のことは再起動が解決してくれる。