Docker Healthcheck вызывает сбой контейнера - PullRequest
0 голосов
/ 24 января 2020

У меня есть настроенное изображение rabbitmq, которое я использую с docker -compose (3.7) для запуска кластера docker. Это необходимо из-за некоторых специфических проблем при попытке развернуть кластер в docker swarm. Образ имеет сценарий оболочки, который выполняется на первичном и вторичном узлах и вносит изменения, необходимые для запуска кластера. Это включает в себя остановку rabbitmq и выполнение команд rabbitmqctl для создания кластера между двумя узлами. Эта конфигурация работает безупречно, пока я не попытаюсь добавить проверку здоровья. Я попытался добавить его в изображение и добавить его в файл композиции. И то, и другое приводит к появлению изображения sh и постоянному перезапуску. У меня есть следующий сценарий оболочки, который копируется в образ:

#!/bin/bash
set -eo pipefail

# A RabbitMQ node is considered healthy if all the below are true:
# * the rabbit app finished booting & it's running
# * there are no alarms
# * there is at least 1 active listener

rabbitmqctl eval '
{ true, rabbit_app_booted_and_running } = { rabbit:is_booted(node()), rabbit_app_booted_and_running },
{ [], no_alarms } = { rabbit:alarms(), no_alarms },
[] /= rabbit_networking:active_listeners(),
rabbitmq_node_is_healthy.
' || exit 1

На уже работающем образе это работает и дает правильный результат. Я попытался добавить поток в файл compose:

     healthcheck:
       interval: 60s 
       timeout: 60s 
       retries: 10 
       start_period: 600s
       test: ["CMD", "docker-healthcheck"]

Кажется, что start_period полностью игнорируется. Я сразу вижу состояние здоровья с ошибкой. Я также пробовал следующую собственную команду диагностики rabbitmq:

rabbitmq-diagnostics -q check_running && rabbitmq-diagnostics -q check_local_alarms

Это странно завершается ошибкой «не удается найти rabbitmq-диагностика», несмотря на то, что программа определенно находится в пути. Я могу успешно выполнить команду в уже запущенном контейнере.

Если я создаю контейнер без проверки работоспособности, а затем добавляю его после факта из командной строки с помощью:

docker service update --health-cmd docker-healthcheck --health-interval 60s --health-timeout 60s --health-retries 10 [container id]

it отмечает контейнер здоровым Так что это работает, но только не в конфигурации запуска. Мне кажется, что проверка здоровья не должна начинаться, пока не пройдет 10 минут. Кажется, не имеет значения, сколько времени я жду, пока все запустится, используя параметр start_period, это все равно вызывает сбой контейнера. Это ошибка или что-то загадочное в том, как работает start_period? У кого-нибудь еще есть эта проблема?

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