コンテナー内で実行されているアプリケーションの場合、コンテナーが (正常に) シャットダウンされているときに SIGTERM を受け取ることが望ましいです。同時に、出力をログ ファイルに出力したいと考えています。
したがって、docker コンテナーの startscript では、exec
これに似たbash を使用していました。
exec command someParam >> stdout.log
これは問題なく機能しcommand
、コンテナーのルート プロセスであり、SIGTERM を受け取るシェルを置き換えました。
アプリケーションは多くのログを記録する傾向があるため、Apache のrotatelogs
ツールを使用してログ ローテーションを追加することにしました。
exec command | rotatelogs -n 10 stdout.log 10M
command
残念ながら、パイプを使用することで、execはシェルを置き換えることができなくなったようです。実行中のコンテナー内のプロセスを で見るとpstree -p
、次のようになります。
mycontainer@/#pstree -p
start.sh(1)-+-command(118)
`-rotatelogs(119)
そのため、bash はルート プロセスのままであり、コマンドに SIGTERM を渡しません。exec に出くわす前に、シグナル ハンドラーを bash スクリプトにインストールする方法を見つけましcommand
たkill
。ただし、これは非常に複雑になり、PID の取得も必ずしも簡単ではありませんでした。シグナル処理に関しては exec の利便性を維持し、ログ ローテーションのパイプを取得したいと考えています。これを達成する方法はありますか?