Как добиться корректной остановки postgres при остановке контейнера docker?

Здравствуйте!
Вопрос больше академический, поэтому хотелось бы найти решение без перехода на какой-либо готовый образ с DockerHub.
Суть вопроса в следующем - для корректной остановки сервера postgres он должен получить сигнал завершения. Для этого желательно, чтобы он был запущен с PID=1
Добиться этого не сложно. В Dockerfile пишем:
USER postgres
CMD ["/opt/pgpro/bin/postgres"]

В результате сервер postgres запускается и от пользователя postgres (от root'а он не хочет запускаться), и имеет PID=1. При остановке контейнера - корректно останавливается.
Но перед пуском сервера желательно выполнить некоторые действия. И действия эти нужно выполнять от root'а.
Т.о. приходится писать скрипт entrypoint.sh в котором сначала выполняются действия, а затем выполняется:
....
su postgres -c '/opt/pgpro/bin/postgres'

А в Dockerfile дерективу USER убираем и CMD меняем на ENTRYPOINT:
ENTRYPOINT ["/entrypoint.sh"]
Действия выполняются от root'а, сервер запускается от своего пользователя. Но PID <> 1 и не завершается корректно.
Т.е. Docker ждет положенное время и просто прибивает процесс (SIGKILL).
Пробовал использовать пакет tini - так же не происходит корректного завершения. Т.е. как будто нет никакого SIGTERM перед ожиданием.
Пытался так же использовать exec... Но он не дружит со сменой пользователя. Ну или я не придумал как это сделать.
Подскажите, как решаются такие проблемы при создании образов?
  • Вопрос задан
  • 357 просмотров
Пригласить эксперта
Ответы на вопрос 2
chupasaurus
@chupasaurus
Сею рефлекторное, злое, временное
В официальных образах postgres запускают в entrypoint с помощью gosu для корректного проброса сигналов, и через перезапуск баш-скрипта под юзером postgres, так что там 2 уровня глубины и все живы.
Ответ написан
Комментировать
fzfx
@fzfx
18,5 дм
Попробуйте заменить
su postgres -c '/opt/pgpro/bin/postgres'
на
setpriv --reuid=UID --regid=GID --init-groups postgres /opt/pgpro/bin/postgres
, заменив UID на UID пользователя postgres в контейнере; GID на GID группы postgres в контейнере.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы