Docker中的Mongo ReplicaSet-无法添加用户:不是主用户

问题描述

我正在尝试设置replicaset,但初始化时遇到问题。

我第一次跑步

id_ = "1294917318405836802"
exp_tweet = api.get_status(id_,tweet_mode = 'extended')
content = exp_tweet._json

然后每次

db_1     | uncaught exception: Error: Couldn't add user: not master 

我的设置是:

/ docker-compose.yml

db_1     | {"t":{"$date":"2020-09-16T16:06:05.341+00:00"},"s":"I","c":"ACCESS","id":20249,"ctx":"conn1","msg":"Authentication Failed","attr":{"mechanism":"SCRAM-SHA-256","principalName":"user","authenticationDatabase":"admin","client":"172.18.0.5:37916","result":"UserNotFound: Could not find user \"user\" for db \"admin\""}}
db_1     | {"t":{"$date":"2020-09-16T16:06:05.342+00:00"},"attr":{"mechanism":"SCRAM-SHA-1","result":"UserNotFound: Could not find user \"user\" for db \"admin\""}}
db_1     | {"t":{"$date":"2020-09-16T16:06:05.349+00:00"},"c":"NETWORK","id":22944,"msg":"connection ended","attr":{"remote":"172.18.0.5:37916","connectionCount":0}}
setup_1  | Error: Authentication Failed. :
setup_1  | connect@src/mongo/shell/mongo.js:362:17
setup_1  | @(connect):2:6
setup_1  | exception: connect Failed
setup_1  | exiting with code 1
docker_setup_1 exited with code 1

/ DockerfileDb

version: "3"
services:
  db:
    image: db
    build: 
      context: .
      dockerfile: DockerfileDb
    environment:
      MONGO_INITDB_ROOT_USERNAME: user
      MONGO_INITDB_ROOT_PASSWORD: xxxx
    ports:
      - "34000:34000"
    volumes:
      - mongodata:/data/db
      - ./monGologs:/data/logs
  db2:
    image: db
    ports:
      - "34001:34000"
    volumes:
      - mongodata2:/data/db
  db3:
    image: db
    ports:
      - "34002:34000"
    volumes:
      - mongodata3:/data/db
  setup:
    image: setup
    build: ./replicasetup
    depends_on:
      - db
      - db2
      - db3
    links:
      - "db:database"
      - "db2:database2"
      - "db3:database3"
volumes:
    mongodata:
    mongodata2:
    mongodata3:

/plicateSetup/mongod.conf

FROM mongo
        
workdir /usr/src/config

copY replicasetup/mongod.conf .
copY replicasetup/shared.key .

EXPOSE 34000

RUN chmod 700 shared.key
RUN chown 999:999 shared.key

CMD ["--config","./mongod.conf"]

/ copySetup / Dockerfile

net: 
  port: 34000
  bindIpAll : true

security:  
  authorization: enabled 
  keyFile: ./shared.key

replication: 
  oplogSizeMB: 1024
  replSetName: amsdb

/plicateSetup/setup.sh

FROM mongo

# Create app directory
workdir /usr/src/configs

# Install app dependencies
copY replicaset.js .
copY setup.sh .

CMD ["./setup.sh"]

/plicateSetup/replicaset.js

sleep 10 | echo Sleeping
mongo mongodb://database:34000 -u "user" -p "xxxx" replicaset.js

感谢您的帮助!

解决方法

您可以通过在docker-compose中使用基本mongo映像来实现此目的

您的设置应如下所示:

/ docker-compose.yml

version: "3.0"

services:
  # Worker 1
  mongo1:
    image: mongo:latest
    volumes:
      - ./replicaSetup:/opt/keyfile
      - mongodata:/data/db
    environment:
      MONGO_INITDB_ROOT_USERNAME: user
      MONGO_INITDB_ROOT_PASSWORD: xxxx
    ports:
      - 27017:27017
    command: 'mongod --auth --keyFile /opt/keyfile/shared.key --replSet amsdb'

  # Worker 2
  mongo2:
    image: mongo:latest
    volumes:
      - ./replicaSetup:/opt/keyfile
      - mongodata2:/data/db
    environment:
      MONGO_INITDB_ROOT_USERNAME: user
      MONGO_INITDB_ROOT_PASSWORD: xxxx
    ports:
      - 27018:27017
    command: 'mongod --auth --keyFile /opt/keyfile/shared.key --replSet amsdb'

  # Worker 3
  mongo3:
    image: mongo:latest
    volumes:
      - ./replicaSetup:/opt/keyfile
      - mongodata3:/data/db
    environment:
      MONGO_INITDB_ROOT_USERNAME: user
      MONGO_INITDB_ROOT_PASSWORD: xxxx
    ports:
      - 27019:27017
    command: 'mongod --auth --keyFile /opt/keyfile/shared.key --replSet amsdb'
volumes:
    mongodata:
    mongodata2:
    mongodata3:

/ plicateSetup / Dockerfile -保持不变

/plicatorSetup/setup.sh -保持不变

/plicateSetup/replicaSet.js


rsconf = {
  _id : "amsdb",members: [
    { _id : 0,host : "172.17.0.1:27017",priority:1 },{ _id : 1,host : "172.17.0.1:27018",{ _id : 2,host : "172.17.0.1:27019",priority:1 }
  ]
}

rs.initiate(rsconf);

rs.conf();
,

在撰写本文时,“ mongo:latest”解析为v4.4.1。答案是针对该版本的entrypoint.sh https://github.com/docker-library/mongo/blob/master/4.4/docker-entrypoint.sh

为了处理MONGO_INITDB_ROOT_ *环境变量并将用户添加到数据库,应该以独立模式启动数据库。看来当前的实现不支持.conf文件中的副本集配置,而仅通过命令行参数来支持。

要么在Dockerfile command: "--bind_ip_all --replSet amsdb --port 34000 ... etc"中传递参数,要么为docker-entrypoint.sh创建PR以支持docker.conf