0

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

4

2 回答 2

0

请记住,docker-composer 主要是开发的东西。对于生产,还有其他方法,例如 Kubernetes。

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

通过这种方式,您可以控制如何检查 - 喜欢ps aux和 grep 您需要的内容。并在需要时通过执行逻辑退出主进程。

sh 脚本看起来像:

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

确保postgres_service_name用 Linux 上 Postgres 服务的真实名称替换。

将该脚本用作 docker compose 中的启动脚本或您将在 prod 中使用的任何内容。

如果您真的需要 2 分钟才能关闭 - 我将实施逻辑,在第一次处理不存在后测量时间

于 2020-11-20T20:32:01.367 回答
0

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

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

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

于 2020-11-20T23:13:49.160 回答