シャットダウンでDockerコンテナをシャットダウンできない(systemd)

シャットダウンでDockerコンテナをシャットダウンできない(systemd)

私は Ubuntu サーバー上でいくつかの Docker コンテナを実行しています。それらは systemd によって制御されています。

実行すると、コンテナは正常にシャットダウンします。journalctl からの出力は次のようになります (逆順に出力され、最新のものが上に表示されます)。systemctl stop [email protected]

Nov 05 10:58:11 ubox0 systemd[1]: Stopped Docker container startup for mw/salcom/app.
Nov 05 10:58:11 ubox0 docker[3622]: mw-salcom-app
Nov 05 10:58:09 ubox0 docker[3470]: [Thu Nov 05 10:58:09.921033 2020] [mpm_prefork:notice] [pid 1] AH00169: caught SIGTERM, shutting down
Nov 05 10:58:09 ubox0 systemd[1]: Stopping Docker container startup for mw/salcom/app...

ただし、 を実行するとshutdown -h now、次のようになります。

Nov 05 10:51:04 ubox0 systemd[1]: Stopped Docker container startup for mw/salcom/app.
Nov 05 10:51:04 ubox0 systemd[1]: [email protected]: Failed with result 'timeout'.
Nov 05 10:51:04 ubox0 systemd[1]: [email protected]: Main process exited, code=killed, status=9/KILL
Nov 05 10:51:04 ubox0 systemd[1]: [email protected]: Killing process 2077 (docker) with signal SIGKILL.
Nov 05 10:51:04 ubox0 systemd[1]: [email protected]: State 'stop-sigterm' timed out. Killing.
Nov 05 10:50:04 ubox0 systemd[1]: [email protected]: Stopping timed out. Terminating.
Nov 05 10:49:04 ubox0 systemd[1]: Stopping Docker container startup for mw/salcom/app...

コンテナは停止されず、プロセスは最終的に 2 分後にタイムアウトし、コンテナは中止されます。

その理由は何でしょうか?

コンテナを正常にシャットダウンして、コンテナ内で実行されているサービスがデータを失うことなく停止するようにしたいと思います。

私のサービス ファイルは次のとおりです:

[Unit]
Description=Docker container startup for %I
Requires=docker.service
After=docker.service

[Service]
TimeoutStartSec=40
Restart=always
# wait a while before restarting in case we are doing a restore;
# this includes a 'docker stop' command after we restore the data
RestartSec=60
ExecStartPre=-/usr/bin/docker stop %i
ExecStart=/usr/bin/docker start -a %i
ExecStop=/usr/bin/docker stop %i
TimeoutStopSec=60

[Install]
WantedBy=multi-user.target

アップデートさらに検索してみると、その投稿を見つけましたDocker コンテナを systemd サービスとして適切に処理するにはどうすればよいですか?同じ問題を説明していますが、そこには答えがありません。

答え1

docker と systemd は必ずしもうまく連携するわけではないようです。以下を参照してください。

別のマシン (バックアップ サーバー) にもまったく同じセットアップがあり、すべて正常に動作しています。シャットダウン コマンドを実行すると、すべての Docker コンテナーが正常にシャットダウンされます。

したがって、問題は依存関係の問題である可能性があります。おそらく、systemd は、Docker コンテナを適切にシャットダウンできるように、Docker コンテナに必要な一部のサービスをシャットダウンしたのでしょう。

「失敗する」システム上の docker バージョンは で18.09.2、「動作する」システム上の docker バージョンは です18.06.1-ce

リリースノートdocker バージョンの18.09状態:

In Docker versions prior to 18.09, containerd was managed
by the Docker engine daemon. In Docker Engine 18.09, 
containerd is managed by systemd.

ユニット ファイルに次の行を追加しました:

[Unit]
...
Requires=containerd.service
After=containerd.service

ユニット ファイル ( systemctl daemon-reload) を再ロードすると、再び動作するようになりました。コンテナーは、設定した 1 分間のタイムアウト後も終了せず、数秒後にシャットダウンしました。

まず、 docker をバージョンにアップグレードしようとしましたが20.10.1、うまくいきませんでした。

私がこの「解決策」のアイデアを思いついたのは、次のことに出会ったときでした。https://github.com/sous-chefs/docker/issues/1062

関連情報