У меня есть настроенное изображение 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
? У кого-нибудь еще есть эта проблема?