Политика перезапуска службы Docker - остановите старую службу, когда новая служба действительно готова - PullRequest
3 голосов
/ 29 мая 2019

У меня есть Tomcat, работающий в качестве службы докера в рое.Когда служба запускается, она загружает много данных в память, что может занять в зависимости от объема данных от 10 до 30 минут.

Моя проблема в том, что когда я обновляю службу (order: start-first), старый контейнер останавливается до того, как новый контейнер инициализирует его данные и поэтому не готов к использованию.

Мне показался многообещающим подход к конфигурации проверки работоспособности в моем docker-compose:

healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/areyouready"]
      interval: 10s
      timeout: 10s
      retries: 30

Проверка работоспособности работает нормально, но старая служба также отключается, а тест возвращает 1 (не работает)) для новой службы.

Я также пытался обработать SIGTERM в своем приложении: запущенная служба получает сигметру и проверяет, должна ли она уже остановиться в зависимости от состояния новой службы:

 Runtime.getRuntime().addShutdownHook(new Thread()
        {
            @Override
            public void run()
            {
                // via db access determine the state of the new started containers, but I don't know
                // how to prevent my tomcat from stopping here
            }
        }

Кроме того, мне не удавалось предотвратить остановку моего кота, но, похоже, это был неправильный путь.

Мое желаемое решение - настроить что-то вроде этого:

update_config: 
    order: start-first
    a-kind-of-stop-condition: ["CMD", "curl", "-f", "http://localhost:8080/areyouready"]

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

Было бы здорово, если бы вы указали мне правильное направление.

С уважением, Себастьян

...