#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
.