我有一个docker容器,它使用monit启动一些服务,比如mongodb,nginx。我有一个bash脚本,由docker用来启动monit。以下是文件的内容:
#!/bin/bash
# Monit will start all apps
/usr/bin/monit -c /etc/monitrc &
# Stay up for container to stay alive
while [ 1 ] ; do
if !(pgrep monit)
then /usr/bin/monit -c /etc/monitrc &
fi
sleep 5m
done
问题是当我运行docker create
命令来创建容器时,bash脚本正常运行并且monit会启动所有服务,但是如果我停止容器并再次启动它,有时monit不会如果它出现了,它就不会启动服务。有人可以验证我的bash脚本是否正常。我使用了以下参考https://blog.deimos.fr/2016/01/13/docker-why-you-should-use-monit-instead-of-supervisord/
答案 0 :(得分:0)
要在容器中运行多个进程,请使用支持在Docker中作为PID 1运行的init系统,例如s6或s6-overlay supervisord。在中间添加自定义脚本只会在服务链中添加额外的链接以及将问题引入系统的可能性。
docker stop
向容器进程发送SIGTERM
signal,然后在默认值10秒后发送SIGKILL
,它将终止容器和运行的任何内容它。
在docker下运行的进程是PID 1,因此您要对needs to handle任何signals进行操作,否则将忽略它们。在服务管理器的情况下,这需要将SIGTERM传递到所有托管服务。请注意,脚本the blog trap
和EXIT
上的示例脚本会依次运行脚本来彻底停止所有monit
服务。 EXIT
包含SIGTERM
。
在您的示例脚本中,在SIGKILL
超时后,容器中运行的所有进程都将以docker stop
终止。
我还没有使用monit
,但作为一名服务经理,我希望它能够优雅地处理被SIGKILL(或kill -9
)杀死并返回下一次(可能不是)。
nginx通常会在SIGKILL
之后存活,因为它默认情况下不会在磁盘上主动存储大量状态。
mongodb确实需要干净地关闭。 SIGKILL
将保留一个需要手动清理的数据库锁文件。