问题描述
对于在容器中运行的我们的应用程序,最好是在(正常)关闭容器时收到SIGTERM。同时,我们希望将其输出保存到日志文件中。
因此,在我们的Docker容器的开始脚本中,我们一直在使用与此类似的bash的exec
exec command someParam >> stdout.log
效果很好,command
替换了曾经是容器根进程的外壳,并且将收到SIGTERM。
由于应用程序倾向于记录很多日志,因此我们决定使用Apache的rotatelogs
工具(即
exec command | rotatelogs -n 10 stdout.log 10M
A,看来通过使用管道,exec不再可以用command
替换shell。现在,使用pstree -p
查看正在运行的容器中的进程时,看起来像这样
mycontainer@/#pstree -p
start.sh(1)-+-command(118)
`-rotatelogs(119)
因此bash仍然是根进程,并且不会将SIGTERM传递给命令。
在绊倒exec之前,我发现了一种将信号处理程序安装到bash脚本中的方法,然后该方法本身将使用command
将SIGTERM发送到kill
进程。但是,这确实变得令人费解,获得PID也不总是那么简单,我想保留exec在处理信号和获取用于日志轮换的管道方面的便利。
知道如何实现吗?
解决方法
也许你想要
exec sh -c 'command | rotatelogs -n 10 stdout.log 10M'