为什么我的mongo容器的docker-compose健康检查总是失败?

Mat*_*son 4 mongodb docker docker-compose

docker-compose用来站一个Express / React / Mongo应用程序。目前,我可以使用Express应用程序中的重试逻辑来支持一切。但是,我更喜欢使用Docker的healthcheck来防止容器最初启动时出现错误字符串。但是,当我在中添加a healthcheckdocker-compose.yml,它将挂起间隔/重试时间限制,并退出:

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

ERROR: for server  Container "70e7aae49c64" is unhealthy.
ERROR: Encountered errors while bringing up the project.
Run Code Online (Sandbox Code Playgroud)

看来我的健康检查从未恢复健康状态,我也不完全知道为什么。我的整个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
Run Code Online (Sandbox Code Playgroud)

对于test,我还尝试了:

["CMD", "nc", "-z", "localhost", "27017"] 
Run Code Online (Sandbox Code Playgroud)

和:

["CMD", "bash", "/mongo-healthcheck"]
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

最终目标是在运行.NET时提供干净的启动输出docker-compose up --build。我也研究了这个问题中的一些解决方案,但是我都运气不佳wait-for-it。在启动其他容器并实现干净启动之前,等待Mongo启动并运行的正确方法是什么?

小智 27

MongoDB 6.0 中删除了 mongo shell。替代者是蒙戈什。

检查这是否适合您:

mongo:
    image: mongo
    healthcheck:
      test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017/test --quiet
Run Code Online (Sandbox Code Playgroud)


Yuc*_*uci 11

我们可以使用MongoDB的serverStatus命令来进行健康检查,MongoDB文档是这样说的:

\n\n
\n

监控应用程序可以定期运行此命令来收集有关实例的统计信息。

\n
\n\n

由于此命令serverStatus需要身份验证,因此您需要设置类似于以下配置的健康检查:

\n\n
version: \'3.4\'\n\nservices:\n  mongo:\n    image: mongo\n    restart: always\n    healthcheck:\n      test: echo \'db.runCommand({serverStatus:1}).ok\' | mongo admin -u $MONGO_INITDB_ROOT_USERNAME -p $MONGO_INITDB_ROOT_PASSWORD --quiet | grep 1\n      interval: 10s\n      timeout: 10s\n      retries: 3\n      start_period: 20s\n    environment:\n      MONGO_INITDB_ROOT_USERNAME: root\n      MONGO_INITDB_ROOT_PASSWORD: example\n\n
Run Code Online (Sandbox Code Playgroud)\n\n

就是这样。如果您的 MongoDB 实例运行状况良好,您将看到与我的类似的内容:

\n\n
$ docker ps\nCONTAINER ID  IMAGE  COMMAND                 CREATED         STATUS                   PORTS      NAMES\n01ed0e02aa70  mongo  "docker-entrypoint.s\xe2\x80\xa6"  11 minutes ago  Up 11 minutes (healthy)  27017/tcp  demo_mongo_1\n
Run Code Online (Sandbox Code Playgroud)\n


Kef*_*fas 9

请注意,如果您使用较新版本的 mongodb,您可能应该使用 mongosh:

    healthcheck:
      test: ["CMD","mongosh", "--eval", "db.adminCommand('ping')"]
      interval: 5s
      timeout: 5s
      retries: 3
      start_period: 5s
Run Code Online (Sandbox Code Playgroud)


sla*_*art 7

首先,我建议将docker-compose.yaml文件版本更新为至少3.4(version: "3.5"),然后将该start_period选项添加到mongo healthcheck中

注意:仅v3.4及更高版本的撰写文件格式支持start_period。

开始时间段为需要时间进行引导的容器提供了初始化时间。在此期间内的探针故障将不计入最大重试次数。但是,如果运行状况检查在启动期间成功,则认为该容器已启动,并且所有连续失败将计入最大重试次数。

所以看起来像这样:

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