Каждый контейнер Docker имеет некоторый основной процесс, независимо от того, был ли он запущен как ENTRYPOINT или CMD.Этот процесс имеет pid 1, с правами и обязанностями, которые влечет за собой.Время жизни контейнера точно соответствует длине этого основного процесса: единственный способ заставить контейнер выйти, это заставить pid 1 выйти.Поскольку pid 1 особенный, может не работать до kill 1
.
Если бы я собирался реализовать это, я бы написал программу (вероятно, на C), которая могла бы выполнятьпроверка работоспособности и запуск основного процесса.Если процесс завершится нормально, супервизор подождет (2) и затем выйдет сам, вызывая выход контейнера.Если проверка работоспособности не удалась, супервизор убил бы (2) своего потомка, подождал бы (2) и затем сам вышел бы.
Я несразу же узнают о готовой реализации этой концепции.Он не отличается от того, что делает supervisord , за исключением того, что supervisor ожидает запуск в качестве процесса инициализации, который никогда не завершается.
Еще одна возможность - реализовать проверки работоспособности в самом приложении.Затем вы просто запускаете один процесс, и если проверка работоспособности завершается неудачно, он может убить себя (например, exit (3)).У высокоуровневых оркестраторов, таких как Kubernetes, также есть концепция проверки работоспособности, которая может быть привязана к сетевому запросу или команде, которая выполняется внутри контейнера (для Kubernetes см. Пробники контейнеров ).