防止Docker容器在主进程终止时退出



我将Postgres与repmgr一起使用,我遇到的一个小问题是,有时repmgr将不得不停止和启动Postgres服务,这只会杀死容器。我在Dokcerfile中在线尝试了一些解决方案,但似乎都不起作用,我可以在docker compose文件中添加一些东西来防止docker立即退出吗,我不想永远活着,但也许几分钟?

请记住,docker composer主要是开发工作。对于生产,还有其他方式,比如kubernetes。

我知道的唯一解决方案是运行我们自己的.sh脚本作为主进程,它将有无限循环,其中包含必要的检查

通过这种方式,您可以控制如何像ps aux和grep一样检查您需要的内容。如果需要,可以通过执行逻辑来退出主进程。

粗布看起来像:

while sleep 180; do
ps aux |grep postgres_service_name |grep -v grep
POSTGRESS=$?
if [ $POSTGRESS -ne 0 ]; then
# do what you need before exiting whole container
exit 1
fi
done

请确保在linux上将postgres_service_name替换为Postgres服务的真实名称。

在docker compose中使用该脚本作为启动脚本,或者在prod.中使用任何脚本

如果你真的需要2分钟才能关闭,我会实现逻辑,在第一次不存在后测量时间

按照docker的设计方式,它将通过启动指定为入口点/命令的命令来启动一个新容器,当该进程终止时,docker将终止该容器中的所有剩余进程并将其关闭。

因此,为了在Postgres进程重新启动时保持容器的运行,您需要在容器中以根进程的身份运行另一个命令。

您可以通过编写一个简单的shell脚本作为包装器来实现这一点,该脚本只有在没有Postgres进程运行时才会退出,或者通过使用专用的init工具(如supervisord(来实现。

最新更新