在为复制集设置Docker Compose时,执行rs.initiate()时出现问题

3
我想使用docker-compose在单个节点上设置MongoDB副本集。这是我的docker-compose.yml文件:
version: '3.7'

services:
  mongodb1:
    image: mongo:latest
    command: mongod --replSet rs0
    ports:
      - 27017:27017
    volumes:
      - ./mongodb1/data:/data/db
    networks:
      - mongo-dev-net

  setup-rs:
    image: mongo:latest
    command: mongo mongodb://mongodb1:27017 --eval "rs.initiate();"
    depends_on:
      - mongodb1
    networks:
      - mongo-dev-net

networks:
  mongo-dev-net:
    driver: bridge

在尝试运行setup-rs服务时,我收到了一个错误。这是错误信息:

Error: 无法连接到服务器mongodb1:27017,连接尝试失败:SocketException: 连接到mongodb1:27017 (MY_IP:27017)时出错,原因是:连接被拒绝:

如果只有一个节点,我应该如何初始化副本集而不使用任何setup.sh文件?谢谢。


“Connection refused” 表示在端口 27017 上没有任何监听。你的命令是否在 mongod 启动完成之前尝试运行? - Joe
@Joe 我只是运行了docker-compose up - Eziz Durdyyev
此问题在此处讨论:https://github.com/docker-library/mongo/issues/339 - Matthew
1个回答

2

您需要首先启动2个MongoDB实例,然后在两者都启动后再调用initiate。

类似这样:

#!/bin/bash

docker-compose up -d

sleep 5

docker exec mongodb1 /scripts/rs-init.sh

在您的mongodb1中,您有像这样的rs-init.sh脚本:

#!/bin/bash

mongo <<EOF
var config = {
    "_id": "dbrs",
    "version": 1,
    "members": [
        {
            "_id": 1,
            "host": "mongodb1:27017",
            "priority": 1
        },
    ]
};
rs.initiate(config, { force: true });
rs.status();
EOF

您可以查看详细的逐步说明此处
附注:我未测试完整的解决方案。

可能值得澄清的是,第二个实例并不是一个真正的数据库,它只是使用相同的Docker镜像来连接运行在第一个实例中的数据库以进行初始化! - Matthew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接