Здравствуйте!
Вопрос больше академический, поэтому хотелось бы найти решение без перехода на какой-либо готовый образ с 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... Но он не дружит со сменой пользователя. Ну или я не придумал как это сделать.
Подскажите, как решаются такие проблемы при создании образов?