【问题标题】:Preventing the Docker container from exiting when the main process dies防止 Docker 容器在主进程死亡时退出
【发布时间】:2021-03-04 06:20:39
【问题描述】:

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

【问题讨论】:

  • 你通常不会尝试重启容器中的服务;由于容器通常只运行一个进程,而容器的生命周期正是该进程的生命周期,因此您只需删除并重新创建整个容器即可。您能否展示一些遇到问题的相关应用程序源代码?

标签: postgresql docker postgres-9.6 repmgr


【解决方案1】:

请记住,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 分钟才能关闭 - 我会实施逻辑,在第一次处理不存在后测量时间

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-11-22
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      • 2010-09-24
      • 2018-02-22
      • 1970-01-01
      • 2019-10-24
      相关资源
      最近更新 更多