Предотвращение выхода контейнера Docker при завершении основного процесса

#postgresql #docker #postgres-9.6 #repmgr

#postgresql #docker #postgres-9.6 #repmgr

Вопрос:

Я использую Postgres с repmgr, одна из небольших проблем, с которыми я сталкиваюсь, заключается в том, что иногда repmgr придется останавливать и запускать службу Postgres, и это просто убьет контейнер, я попробовал некоторые онлайн-решения в Dokcerfile, но, похоже, ни одно из них не работает, есть ли что-нибудь, что я могу добавить вdocker-создайте файл, чтобы предотвратить немедленный выход docker, я не хочу оставаться в живых вечно, но, может быть, пару минут?

Комментарии:

1. Обычно вы не пытаетесь перезапускать службы в контейнерах; поскольку контейнер обычно запускает ровно один процесс, а жизненный цикл контейнера в точности соответствует жизненному циклу этого процесса, вы просто удаляете и воссоздаете весь контейнер. Можете ли вы показать какой-нибудь соответствующий исходный код приложения, в котором есть проблема?

Ответ №1:

Помните, что docker-composer — это в основном разработка. Для производства есть другие способы, например, kubernetes.

Единственное известное мне решение — запустить наш собственный скрипт .sh в качестве основного процесса, который будет иметь бесконечный цикл с необходимыми проверками.

Таким образом, вы можете контролировать, как проверять и проверять то, что вам нужно. ps aux и выйдите из основного процесса, если вам нужно, выполнив логику.

sh scrip будет выглядеть примерно так:

 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 на реальное имя службы Postgres в Linux.

Используйте этот скрипт в качестве сценария запуска в docker compose или что бы вы ни использовали в prod.

если вам действительно нужно за 2 минуты до его выключения — я бы реализовал логику, которая измеряла бы время после того, как процесс первого раза отсутствует

Ответ №2:

Разработан способ docker запуска нового контейнера путем запуска команды, указанной в нем как entrypoint / command, и когда этот процесс завершится docker , все оставшиеся процессы в этом контейнере будут уничтожены и завершены.

Таким образом, чтобы контейнер продолжал работать во время перезапуска процесса Postgres, вам необходимо запустить другую команду в качестве корневого процесса в контейнере.

Вы можете добиться этого, написав простой сценарий оболочки в качестве оболочки, который завершится только тогда, когда процесс Postgres больше не выполняется, или с помощью специального инструмента инициализации, такого как supervisord .