mongodb 无法验证使用docker env变量创建的mongo用户

fcg9iug3  于 2023-10-16  发布在  Go
关注(0)|答案(2)|浏览(92)

我使用的是官方的mongodb docker image和docker-compose。但是我无法使用环境变量MONGO_INITDB_ROOT_USERNAMEMONGO_INITDB_ROOT_PASSWORD进行身份验证。在docker-compose.yaml中:

mongo:
    image: mongo:4.4
    container_name: mongo
    restart: unless-stopped
    tty: true
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: somepass
      MONGO_INITDB_DATABASE: somedb
      SERVICE_TAGS: dev
      SERVICE_NAME: mongo
    ports:
      - "27017:27017"
    volumes:
      - mongodbdata:/data/db
    networks:
      - backend-network

运行容器后,我无法进行身份验证:

$ docker exec -it mongo mongo -u root -p somepass --authenticationDatabase somedb
MongoDB shell version v4.4.1
connecting to: mongodb://127.0.0.1:27017/?authSource=somedb&compressors=disabled&gssapiServiceName=mongodb
Error: Authentication failed. :
connect@src/mongo/shell/mongo.js:374:17
@(connect):2:6
exception: connect failed
exiting with code 1

我不知道我做错了什么。看起来这个用户甚至没有被创建:

{"t":{"$date":"2020-10-10T11:23:05.772+00:00"},"s":"I",  "c":"ACCESS",   "id":20249,   "ctx":"conn1","msg":"Authentication failed","attr":{"mechanism":"SCRAM-SHA-1","principalName":"root","authenticationDatabase":"somedb","client":"127.0.0.1:50990","result":"UserNotFound: Could not find user \"root\" for db \"somedb\""}}

我也试过:

  • 删除env变量MONGO_INITDB_DATABASE并根据“admin”db进行身份验证。
  • 我在一个js文件中用db.createUser()创建了一个额外的用户,我已经把这个js文件放在了/docker-entrypoint-initdb.d的容器中,然后尝试用这个用户进行身份验证。

我在这两种情况下都得到了相同的错误消息。

**编辑:**当我没有绑定挂载到/data/db时,它可以工作

tsm1rwdh

tsm1rwdh1#

您应该使用authenticationDatabase admin进行身份验证。
关于docs
MONGO_INITDB_ROOT_USERNAME,MONGO_INITDB_ROOT_PASSWORD这些变量一起使用,创建一个新用户并设置该用户的密码。此用户是在管理员身份验证数据库中创建的,并被赋予root角色,即“超级用户”角色。
docker exec -it mongo mongo -u root -p somepass --authenticationDatabase admin
应该可以。
成功的顺序:

  • 创建以下docker-compose.yaml
mongo:
      image: mongo:4.4
      container_name: mongo
      restart: unless-stopped
      tty: true
      environment:
        MONGO_INITDB_ROOT_USERNAME: root
        MONGO_INITDB_ROOT_PASSWORD: somepass
        MONGO_INITDB_DATABASE: somedb
        SERVICE_TAGS: dev
        SERVICE_NAME: mongo
      ports:
        - "27017:27017"
  • docker-compose.yaml所在的文件夹中运行docker-compose up -d
  • 登录到mongo shell:docker exec -it mongo mongo -u root -p somepass --authenticationDatabase admin
6l7fqoea

6l7fqoea2#

我知道这个问题是旧的,但我刚刚有同样的事情发生在我身上。在我身上发生的事情是,我不小心为MongoDB init使用了错误的环境变量,所以它从未创建用户(在我的情况下是mongo/mongo)。
而我像你一样使用volumes意味着无论我做了什么(除了从 docker-compose.yml 中删除volumes,和你一样),它永远不会正确连接到我指定的用户名和密码。

  • 您需要做的是,以及任何有此问题的人,删除主机上的卷,以便使用docker compose文件中的新环境数据重新创建它。

所以在你的例子中,你所需要做的就是删除mongodbdata文件夹和/或它的内容,所以下次你运行你的合成,它将重新初始化数据库与新的数据:)。
所以最后,除了使用authSource=admin--authenticationDatabase admin之外,我还必须这样做。
希望这能为其他有这个问题的人节省时间,我刚刚在一个愚蠢的问题上失去了2个小时的生命:)。

相关问题