私は 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