Docker Compose中使用MongoDB复制集

6

我能够使用docker compose.yml文件设置用户名、密码和创建数据库

version: '3'

services:
  mongodb:
    image: mongo
    volumes:
      - /home/temp/finalewd/temp:/var/lib/mongodb
    restart: on-failure
    ports:
      - "27017:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: XXXX
      MONGO_INITDB_ROOT_PASSWORD: XXXX
      MONGO_INITDB_DATABASE: XXXX

它会使用配置好的用户名和密码,在一个名为XXXX的数据库中启动新的mongo容器。

但是,当我尝试像下面这样设置具有副本集的mongo docker容器时,

# Use root/example as user/password credentials
version: '3.1'

services:

  mongo:
    image: mongo
    restart: on-failure
    volumes:
      - /home/temp/mongo/compose/data:/data/db
    entrypoint: [ "/usr/bin/mongod", "--bind_ip_all","--replSet", "rs0" ]
    environment:
      MONGO_INITDB_ROOT_USERNAME: XXXX
      MONGO_INITDB_ROOT_PASSWORD: XXXX
      MONGO_INITDB_DATABASE: XXXX

使用上述docker-compose.yml文件,它可以启动副本集,但无法创建数据库/用户名/密码。
为什么在上述情况下环境变量未被使用?
感谢任何帮助。 Thomas答案的内容: 尝试使用Thomas的答案中的docker-compose.yml文件,一旦mongo已经启动,我尝试了"rs.initiate",但它会抛出已经初始化的状态,那么在这种情况下如何将mongo设置为主节点?
rs0:OTHER> rs.status();
{
    "operationTime" : Timestamp(1552397666, 1),
    "ok" : 0,
    "errmsg" : "Our replica set config is invalid or we are not a member of it",
    "code" : 93,
    "codeName" : "InvalidReplicaSetConfig",
    "$clusterTime" : {
        "clusterTime" : Timestamp(1552397666, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}


rs0:OTHER> rs.initiate()
{
    "operationTime" : Timestamp(1552397666, 1),
    "ok" : 0,
    "errmsg" : "already initialized",
    "code" : 23,
    "codeName" : "AlreadyInitialized",
    "$clusterTime" : {
        "clusterTime" : Timestamp(1552397666, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}
rs0:OTHER> 

感谢您的来信,Harry。
1个回答

10

原始的入口点来自mongo docker image,负责在容器启动时创建(最终缺失的)数据库。

由于您在docker-compose.yml文件中覆盖了此入口点(entrypoint: [ "/usr/bin/mongod", "--bind_ip_all","--replSet", "rs0" ]),因此您将失去原始入口点的所有功能。

这个docker镜像文档告诉我们,我们可以使用docker compose command:指令向mongo进程传递选项。您的docker-compose.yml文件应该是:

version: '3.1'

services:

  mongo:
    image: mongo
    restart: on-failure
    volumes:
      - /home/temp/mongo/compose/data:/data/db
    command: "--bind_ip_all --replSet rs0"
    environment:
      MONGO_INITDB_ROOT_USERNAME: XXXX
      MONGO_INITDB_ROOT_PASSWORD: XXXX
      MONGO_INITDB_DATABASE: XXXX

谢谢@Thomasleveil,我尝试使用这个作为docker-compose.yml并登录mongo db,尝试了“rs.initiate”但失败了,请查看问题中的更新。 - Harry
2
我从未使用复制集设置过Mongo,但是您不应该创建一个密钥文件并使用--keyFile命令行选项吗? - Thomasleveil
我通过使用密钥文件找到了解决方法,感谢@Thomasleveil。我使用mongod --help命令,它列出了所有内容。非常感谢您的帮助。 - Harry
4
@Harry - 如果您能在回答中添加关于密钥文件部分的说明,那将非常棒。我在尝试时遇到了困难。 - Mike
@Harry,你能提供一下你设置密钥文件时使用的配置吗?我也在苦苦挣扎。 - rrriki

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