Dockerコンテナを正常にシャットダウンする方法

Dockerコンテナを正常にシャットダウンする方法

CentOS 7 を実行している Docker コンテナがあります。

PID 1 としてスクリプトを実行しています。docker wrapper_script.shcompose にも以下があります。

CMD ["/wrapper_script.sh"]

docker stopコンテナで試してみました。クリーンアップ機能が実行されておらず、コンテナが直接停止しています。

試しましたdocker kill --signal="SIGTERM" <containername>。クリーンアップ機能も実行されていません。また、これはコンテナ自体を強制終了/停止するものではないことに注意してください。

これを修正するためにご協力ください。どんな提案でも歓迎します。

wrapper_script.shは以下の通りです。

#!/usr/bin/env bash
cleanup() {
    echo "Cleaning up..."
    /wrapper-script-stop.sh
}
trap 'cleanup' SIGTERM EXIT
/run-something.sh
while sleep 60; do
  ps aux |grep run-something.sh |grep -q -v grep
  PROCESS_1_STATUS=$?
  if [ $PROCESS_1_STATUS -ne 0 ]; then
    echo "One of the processes has already exited."
    exit 1
  fi
done

答え1

bash スクリプトと質問の関係はわかりませんが、コンテナを停止する方法に関する情報がここにあります。

コマンドを発行するとdocker stop、Docker はまずプロセスを停止するように丁寧に要求し、デフォルトの 10 秒以内に従わない場合は強制的に終了します。docker stop戻るまでに 10 秒以上かかる場合は、コンテナがこの時間内に応答しなかったことを意味します。

このdocker stopコマンドは、まずコンテナ内のルート プロセス (PID 1) に SIGTERM シグナルを送信して、実行中のコンテナを停止しようとします。このタイムアウト内にプロセスが終了しない場合は、SIGKILL シグナルが送信されます。

プロセスが SIGTERM シグナルを無視することを選択している可能性がありますが、SIGKILL は無視できません。SIGKILL が発行されると、プロセスはシグナルを認識できなくなるため、クリーンアップ アクションを実行できません。

Docker デーモンが SIGKILL を送信する前に待機する秒数を制御できます。プロセスの完了にさらに時間が必要な場合は、次のようなコマンドを使用できます。

docker stop --time=30 mycontainer

プロセスがハングしている場合は、このクリーンアップ アクションを実行するためにプロセスが正常に終了する必要があるかどうか、その理由を調べる必要があります。

関連情報