【问题标题】:Mongodb with replica set in docker compose在 docker compose 中具有副本集的 Mongodb
【发布时间】:2019-03-12 13:14:27
【问题描述】:

我可以使用 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

它会打开新的 mongo 容器,数据库为 XXXX ,配置用户名和密码。

但是当我尝试使用如下副本集设置 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 的答案中的内容尝试了 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> 

谢谢, 哈利

【问题讨论】:

    标签: mongodb docker docker-compose mongodb-query


    【解决方案1】:

    来自mongo docker image 的原始entrypoint 负责在容器启动时创建(最终丢失)数据库。

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

    这个 docker 镜像文档 tells us 我们可以使用 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”但失败,请检查问题中的更新
    • 我从未使用副本集设置 mongo,但您不应该创建一个密钥文件并使用 --keyFile 命令行选项吗?
    • 我想出了使用密钥文件感谢@Thomasleveil 我使用 mongod --help,它列出了所有。感谢您的帮助
    • @Harry - 如果您也可以在答案中添加密钥文件部分,那就太棒了。无法正常工作。
    • @Harry 你能提供你用来设置密钥文件的配置吗?我也在为此苦苦挣扎
    猜你喜欢
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多