Dockerで起動中のコンテナを停止しようと、ctrl + c やdocker stopを実行したところ停止できずに、待機の状態が続く場合の対処法について。
症状
Railsコンテナと一緒に起動したDBコンテナのみが停止できない状態。
以下の、rails-aa-dbコンテナ。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7cbc7a448642 postgres "docker-entrypoint.s…" 17 hours ago Up 2 hours 5432/tcp rails-aa-db
停止指示を出してから放置し続けると、最終的にはエラーで終わり、結局コンテナを停止できない。
Gracefully stopping... (press Ctrl+C again to force)
Stopping rails-aa-web ... done
Stopping rails-aa-db ...
ERROR: for rails-aa-db UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=70)
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 restart
や docker container rm -f <コンテナ名>
も使えない状態。
対処法
dockerのコンテナがスタックしていることが原因です。解消するには、docker自体(dockerデーモン)を再起動する必要があります。
主な方法は2つあります。
- PCを再起動する(シンプルに)
- docker desktopを再起動する。
どちらも同じです。(※起動中のコンテナは全て停止します)
docker desktopの再起動
docker desktopを再起動するには、起動中のdockerのアイコンをクリックして、Restartを選択します。
これで、Docker自体を再起動できます。
再起動したら、docker ps
で確認するとコンテナが全て停止していることが確認できます。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES