Задать вопрос

Контейнер rabbitmq docker стартует раньше чем сервис nginx. Как указать согласованность запуска?

Всем доброго дня!
Помогите пожалуйста, добрые люди. Как указать согласованность запуска контейнера docker строго после запуска сервиса nginx, установленного на хосте?

Дано:
- есть nginx, он запускается в виде сервиса на хосте
- в nginx подключен модуль Nemesida WAF, который обращается к RabbitMQ сразу при запуске nginx.
- после перезапуска машины, в логах не красивая картина, много сообщений "Nemesida WAF: unable to connect to the RabbitMQ". Сервис nginx запускается раньше, а rabbitmq к этому моменту ещё не успевает запуститься. Отсюда эти сообщения.

Пробовал прописать строку "Before=nginx.service" в блоке [Unit] в файле rabbitmq-server.service. Эффекта нет.
Учитывая, что эта настройка - она для контейнера, то контейнер docker просто не увидит nginx.service при запуске, потому что nginx.service установлен на хосте.
Если бы nginx был тоже в контейнере, тогда очерёдность запуска легко решалась бы при помощи docker-compose, но у нас nginx на хосте, и это продакшен.

Помогите, пожалуйста, решить вопрос: как заставить контейнер rabbitmq запускаться строго ДО старта сервиса nginx, установленного не в docker?
  • Вопрос задан
  • 958 просмотров
Подписаться 6 Простой 5 комментариев
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack-разработчик на Python
    14 месяцев
    Далее
  • Яндекс Практикум
    Python-разработчик буткемп
    4 месяца
    Далее
  • Академия Eduson
    DevOps-инженер
    7 месяцев
    Далее
Решения вопроса 1
@Zerg89
Насколько помню если нужно согласовать несколько контейееров то это docker-compose
И в нем должно быть что-то типа такого
celery:
   depends_on:
     - rabbitmq # старт после старта контейнера rabbitmq
   command: sh -c './wait-for host:5432 -- cmd' # ожидаем
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
ky0
@ky0 Куратор тега Nginx
Миллиардер, филантроп, патологический лгун
depends_on + healthcheck в docker-compose. Просто depends_on недостаточно - нужно проверять работоспособность сервиса, а не просто что контейнер запустился.
Ответ написан
Комментировать
@dronmaxman
VoIP Administrator
Через systemd есть несколько вариантов, но наверное самый простой добавить в nginx.service
[Service]
ExecStartPre=/bin/bash -c 'until docker inspect -f {{.State.Health.Status}} rabbitmq | grep -q healthy; do sleep 2; done'


services:
  rabbitmq:
    image: rabbitmq:3.13-management
    healthcheck:
      test: ["CMD", "rabbitmq-diagnostics", "ping"]
      interval: 10s
      timeout: 5s
      retries: 6
    ports:
      - "5672:5672"
      - "15672:15672"
Ответ написан
Комментировать
@TheDigitalMadness
Программист
Почитал твои комментарии. Если я правильно понял, у тебя nginx стоит непосредственно на сервисе. Смотри, лучшее решение - перенести nginx внутрь docker compose. Так ты железно сможешь контролировать порядок запуска. Я обычно делаю так:

nginx:
    image: nginx:alpine
    container_name: nginx
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf:rw
      - /etc/letsencrypt:/etc/letsencrypt:rw
    depends_on:
      - users-service
    networks:
      - users-service
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы