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

Mongodb 无法验证使用docker env变量创建的mongo用户,mongodb,docker,Mongodb,Docker,我在用docker compose的官方软件。 但是我无法使用环境变量MONGO\u INITDB\u ROOT\u USERNAME,MONGO\u INITDB\u ROOT\u PASSWORD进行身份验证。 在docker-compose.yaml中: mongo: image: mongo:4.4 container_name: mongo restart: unless-stopped tty: true environment:

我在用docker compose的官方软件。 但是我无法使用环境变量
MONGO\u INITDB\u ROOT\u USERNAME
MONGO\u INITDB\u ROOT\u 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_数据库
    ,并根据“admin”db进行身份验证
  • 在我放入
    /docker entrypoint initdb.d
    容器中的js文件中创建了另一个具有
    db.createUser()
    的用户,然后尝试对此用户进行身份验证
在这两种情况下,我都收到了相同的错误消息

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

您应该使用
authenticationDatabase admin
进行身份验证

从:

MONGO_INITDB_ROOT_用户名,MONGO_INITDB_ROOT_密码 变量,结合使用,创建一个新用户并设置该用户的 密码。此用户是在管理员身份验证数据库中创建的 并指定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


我仍然会遇到同样的错误。只有当我从docker-compose.yaml中删除
volumes
部分时,它才起作用。一旦删除
network
部分,我就不知道为什么它对我有效,因为我没有这样的网络
mongodata
被命名为卷,它可能已经包含数据,
docker compose up
在运行它时可能会失败。我已经用一系列命令更新了我的答案,这些命令应该会起作用,我建议在成功后克服身份验证问题
docker compose up
,然后添加网络和卷。当您删除
volumes
部分时,
mongodb
将数据存储在容器中,它从空数据开始,所以它可以解释你为什么成功。当您使用命名卷
mongodbdata
时,它可能已经包含数据(包括管理员数据库的用户名和密码)。您还应该删除
MONGO\u INITDB\u数据库
env.variable,除非您使用它。