MacでDockerコンテナを終了できなくなったときの対処法

Docker Desktopを再起動しよう。それだけ。

 

 

[症状]

こんな感じでDocker上にNginxとReactアプリとjson-serverを立てて遊んでいたところ、なぜかDockerコンテナを終了できなくなってしまった。

なんらかのnpmモジュールを追加したタイミングだったような気もするが、原因は定かではない。

f:id:kidani_a:20190914232055p:plain

github.com

 

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).

 

f:id:kidani_a:20190914174437p:plain

 

コンテナの中に接続して状況を探ることもできない。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が見つかった。

github.com

 

他にも類似のIssueがいくつか存在していたから、割とよく起きる問題ではあるようだ。

UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=70) · Issue #3834 · docker/compose · GitHub

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の現在値の部分が更新されているので、設定は変更できたが効果がないらしい。

f:id:kidani_a:20190914174452p:plain

 

念のため、10倍の600を指定して実行してみるもやはり効果がない。ネットワークが遅い場合には効果があるということだが、今回はどうやらそういった原因ではないため、この対処方法ではDockerコンテナを終了することができないらしい。

f:id:kidani_a:20190914174512p:plain

 

対処法2:Docker Desktopを再起動する(効果あり)

GitHubのIssueを読みすすめると、Dockerを再起動しても直る、と書かれていた。確かにDockerサービス自体が停止すればその上で動いているコンテナも止まるからこれで良さそうだ。 

f:id:kidani_a:20190914233049p:plain

 

MacのメニューバーからDocker Desktopのアイコンをクリックしてメニューを表示し、「Restart」をクリックする。

f:id:kidani_a:20190914173935p:plain

 

すると、再起動するとコンテナが停止するが問題ないか確認が入る。コンテナを停止したくてDocker Desktopを再起動しているのでなんの問題もない。OKボタンをクリックする。

f:id:kidani_a:20190914174007p:plain

すると、ステータスの表示がDocker Desktop is startingと起動中に変わり、しばらくして起動が完了した。

f:id:kidani_a:20190914173919p:plain

f:id:kidani_a:20190914173908p:plain

  

docker psコマンドを実行すると、実行中のコンテナがないことが確認できた。

f:id:kidani_a:20190914174203p:plain

 

[まとめ]

  • Dockerコンテナを終了できなくなったらDocker Desktopを再起動しよう

 

大抵のことは再起動が解決してくれる。