Docker - Как дождаться запуска контейнера - PullRequest
1 голос
/ 06 апреля 2019

я хочу запустить три контейнера для моего веб-приложения. Контейнеры: база данных frontend, backend и mongo.
Для этого я пишу следующий docker-compose.yml

version: '3.7'

services:
  web:
    image: node
    container_name: web
    ports:
    - "3000:3000"
    working_dir: /node/client
    volumes:
    - ./client:/node/client
    links:
    - api
    depends_on:
    - api
    command: npm start
  api:
    image: node
    container_name: api
    ports:
    - "3001:3001"
    working_dir: /node/api
    volumes:
    - ./server:/node/api
    links:
    - mongodb
    depends_on:
    - mongodb
    command: npm start
  mongodb:
    restart: always
    image: mongo
    container_name: mongodb
    ports:
    - "27017:27017"
    volumes:
    - ./database/data:/data/db
    - ./database/config:/data/configdb

и обновить строку подключения в моем файле .env

MONGO_URI = 'mongodb://mongodb:27017/test'

Я запускаю его с docker-compose up -d и все продолжается.
Проблема в том, что я запускаю docker logs api -f для мониторинга состояния бэкэнда: у меня ошибка MongoNetworkError: failed to connect to server [mongodb:27017] on first connect, потому что мой контейнер mongodb работает, но не в ожидающих соединениях (он повышается после попытки соединения бэкендом).

Как я могу проверить, находится ли mongodb в состоянии ожидания соединения перед запуском контейнера API?

Заранее спасибо

1 Ответ

1 голос
/ 06 апреля 2019

Несколько возможных решений в порядке предпочтения:

  1. Настройте ваше приложение на повторную попытку после небольшой задержки и, в конечном итоге, на превышение времени ожидания после слишком большого количества сбоев подключения. Это идеальное решение для переносимости, а также может использоваться для перезапуска базы данных после того, как ваше приложение уже запущено и подключено.

  2. Используйте точку входа, которая ждет монго, чтобы стать доступным. Вы можете попробовать полный монго-клиент connect + login или простую проверку порта tcp с помощью скрипта, подобного wait-for-it . Как только эта проверка завершится (или завершится с ошибкой), вы можете продолжить с точки входа на запуск приложения.

  3. Сконфигурируйте docker для повторного запуска приложения с политикой перезапуска или разверните его с оркестровкой, которая автоматически восстанавливается при сбое приложения. Это далеко не идеальное решение, но чрезвычайно простое в реализации.

Вот пример варианта 3:

  api:
    image: node
    deploy:
      restart_policy:
        condition: unless-stopped

Обратите внимание, что, глядя на ваш файл компоновки, в вашем файле компоновки есть сочетание синтаксиса v2 и v3, и многие параметры, такие как зависимости_ключа, ссылки и имя_ контейнера, недопустимы в режиме роя. Вы также определяете настройки, такие как working_dir, которые на самом деле должны быть сделаны в вашем Dockerfile.

...