用于在docker-compose中初始化Mongodb复制集的健康检查

pftdvrlh  于 2023-06-29  发布在  Go
关注(0)|答案(1)|浏览(124)

下面是带有MongoDB副本集的docker-compose文件,我正在使用健康检查来初始化该副本集。它通常会完成任务,但一段时间后会在容器上生成警告。有人能解释一下为什么支票没有通过吗?我添加了一个OR语句(“rs.status().ok”),它应该在初始化后工作。(我知道healthckeck不应该用于此,它用于一个项目)

healthcheck:
            test: test $$(echo "rs.initiate({_id:'rs0',members:[{_id:0,host:\"mongodb1:27017\"},{_id:1,host:\"mongodb2:27018\"},{_id:2,host:\"mongodb3:27019\"}]}).ok || rs.status().ok" | mongosh --port 27017 --quiet) -eq 1
            interval: 10s
            start_period: 30s
            timeout: 60s

这里只有一个helthckeck。

version: "3"

services:
    mongodb1:
        container_name: mongodb1
        image: mongo
        restart: always
        ports:
        - "27017:27017"
        command: mongod --replSet rs0 --port 27017 --bind_ip_all
        healthcheck:
            test: test $$(echo "rs.initiate({_id:'rs0',members:[{_id:0,host:\"mongodb1:27017\"},{_id:1,host:\"mongodb2:27018\"},{_id:2,host:\"mongodb3:27019\"}]}).ok || rs.status().ok" | mongosh --port 27017 --quiet) -eq 1
            interval: 10s
            start_period: 30s
            timeout: 60s
        volumes:
         - ./mongodb/db1:/data/db
        networks:
            - Internal
            
    mongodb2:
        container_name: mongodb2
        image: mongo
        restart: always
        ports:
        - "27018:27018"
        command: mongod --replSet rs0 --port 27018 --bind_ip_all
        networks:
            - Internal
        volumes:
         - ./mongodb/db2:/data/db
        depends_on:
            - mongodb1

    mongodb3:
        container_name: mongodb3
        image: mongo
        restart: always
        ports:
        - "27019:27019"
        command: mongod --replSet rs0 --port 27019 --bind_ip_all
        networks:
            - Internal 
        volumes:
         - ./mongodb/db3:/data/db
        depends_on:
            - mongodb1
    networks:
    Internal:
        internal: true
    External:

这是完整的docker compose文件。

wmtdaxz3

wmtdaxz31#

运行rs.initiate()后,您必须等待一段时间,直到副本集启动。
对于初始化和健康检查,我建议使用如下脚本:

var i = rs.initiate({ 
   _id: 'rs0',
   members:[
      { _id: 0, host: 'mongodb1:27017' },
      { _id: 1, host: 'mongodb2:27018' },
      { _id: 2, host: 'mongodb3:27019' }
   ]
});
if (i.ok != 1) {
   print(EJSON.stringify(i)); 
   quit(1);
}
while (! db.hello().isWritablePrimary ) sleep(1000);

mongosh中运行此脚本并检查返回值$?

相关问题