Почему проверка работоспособности docker-compose моего контейнера mongo всегда дает сбой? - PullRequest
0 голосов
/ 27 января 2019

Я использую docker-compose, чтобы запустить приложение Express / React / Mongo. В настоящее время я могу выдержать все, используя логику повтора в экспресс-приложении. Однако я бы предпочел использовать Docker's healthcheck , чтобы предотвратить строку ошибок, когда контейнеры изначально раскручиваются. Однако, когда я добавляю healthcheck в мой docker-compose.yml, он зависает в течение интервала времени / повторной попытки и завершается с:

ERROR: for collector  Container "70e7aae49c64" is unhealthy.

ERROR: for server  Container "70e7aae49c64" is unhealthy.
ERROR: Encountered errors while bringing up the project.

Кажется, что моя проверка здоровья никогда не возвращает здоровое состояние, и я не совсем уверен, почему. Весь мой docker-compose.yml:

version: "2.1"
services:
  mongo:
    image: mongo
    volumes:
      - ./data/mongodb/db:/data/db
    ports:
      - "${DB_PORT}:${DB_PORT}"
    healthcheck:
      test: echo 'db.runCommand("ping").ok' | mongo mongo:27017/test --quiet 1
      interval: 10s
      timeout: 10s
      retries: 5
  collector:
    build: ./collector/
    environment:
      - DB_HOST=${DB_HOST}
      - DB_PORT=${DB_PORT}
      - DB_NAME=${DB_NAME}
    volumes:
      - ./collector/:/app
    depends_on:
      mongo:
        condition: service_healthy
  server:
    build: .
    environment:
      - SERVER_PORT=$SERVER_PORT
    volumes:
      - ./server/:/app
    ports:
      - "${SERVER_PORT}:${SERVER_PORT}"
    depends_on:
      mongo:
        condition: service_healthy

Для test я тоже пробовал:

["CMD", "nc", "-z", "localhost", "27017"] 

И

["CMD", "bash", "/mongo-healthcheck"]

Я тоже вообще пытался бросить healthcheck, следуя совету этого парня . Все встает, но я получаю страшные ошибки в выводе перед успешным соединением:

collector_1  | MongoDB connection error: MongoNetworkError: failed to connect to server [mongo:27017] on first connect [MongoNetworkError: connect 
ECONNREFUSED 172.21.0.2:27017]
collector_1  | MongoDB connection with retry
collector_1  | MongoDB connection error: MongoNetworkError: failed to connect to server [mongo:27017] on first connect

Конечная цель - чистый запуск при запуске docker-compose up --build. Я также рассмотрел некоторые решения в этом вопросе , но мне тоже не повезло с wait-for-it. Как правильно подождать, пока Mongo будет запущен и запущен, прежде чем запускать другие контейнеры и добиваться чистого запуска?

Ответы [ 3 ]

0 голосов
/ 19 апреля 2019

Когда я выполняю команду echo db.runCommand("ping").ok' | mongo localhost:27017/test --quiet 1 в контейнере Docker, результат:

    2019-04-19T02:39:19.770+0000 E -        [main] file [1] doesn't exist
    failed to load: 1

Попробуйте это

healthcheck:
  test: echo 'db.runCommand("ping").ok' | mongo mongo:27017/test --quiet | echo $?
0 голосов
/ 21 июня 2019

Я нашел решение здесь https://github.com/docker-library/healthcheck/tree/master/mongo

Обратите внимание, это объясняет, почему проверка работоспособности не включена в официальное изображение https://github.com/docker-library/cassandra/pull/76#issuecomment-246054271

докер-Healthcheck

#!/bin/bash
set -eo pipefail

if mongo --quiet "localhost/test" --eval 'quit(db.runCommand({ ping: 1 }).ok ? 0 : 2)'; then
    exit 0
fi

exit 1

В примере по ссылке они используют host variable

host="$(hostname --ip-address || echo '127.0.0.1')"

if mongo --quiet "$host/test" --eval 'quit(db.runCommand({ ping: 1 }).ok ? 0 : 2)'; then
# continues the same code

У меня это не сработало, поэтому я заменил host на localhost .

В Docker-compose

mongo:
  build:
    context: "./mongodb"
    dockerfile: Dockerfile
  container_name: crm-mongo
  restart: always
  healthcheck:
    test:  ["CMD", "docker-healthcheck"]
    interval: 10s
    timeout: 2s
    retries: 10

Кроме того, вы можете выполнять проверки работоспособности в контейнере. Измените Dockerfile или что.

FROM mongo:4

ADD docker-healthcheck /usr/local/bin/
0 голосов
/ 27 января 2019

Сначала я бы предложил обновить версию файла docker-compose.yaml как минимум до 3,4 (version: "3.5"), затем добавьте опцию start_period к вашей проверке здоровья Монго

Примечание: start_period поддерживается только для v3.4 и выше в формате compose.

начальный период обеспечивает время инициализации для контейнеров, которым требуется время для начальной загрузки. Отказ зонда в течение этого периода не засчитывается в максимальное количество попыток. Однако, если проверка работоспособности прошла успешно в течение начального периода, контейнер считается запущенным, и все последующие сбои будут засчитаны в максимальное количество попыток.

Так это будет выглядеть примерно так:

healthcheck:
  test: echo 'db.runCommand("ping").ok' | mongo mongo:27017/test --quiet 1
  interval: 10s
  timeout: 10s
  retries: 5
  start_period: 40s
...