mongo db docker 镜像身份验证失败

Bog*_*byk 3 mongodb docker

我在本地 docker 环境中使用https://hub.docker.com/_/mongo mongo 图像,但Authentication failed出现错误。在docker-compose我添加它:

 my-mongo:
    image: mongo
    restart: always
    container_name:  my-mongo
    environment:
      MONGO_INITDB_ROOT_USERNAME: mongo
      MONGO_INITDB_ROOT_PASSWORD: asdfasdf
    networks:
      - mynet
Run Code Online (Sandbox Code Playgroud)

我还尝试从容器内部运行 mongo CLI,但仍然遇到相同的错误:

root@76e6db78228b:/# mongo
MongoDB shell version v4.2.3
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("c87c0f0e-fe83-41a6-96e9-4aa4ede8fa25") }
MongoDB server version: 4.2.3
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
        http://docs.mongodb.org/
Questions? Try the support group
        http://groups.google.com/group/mongodb-user
> use translations
switched to db translations  
> db.auth("mongo", "asdfasdf")
Error: Authentication failed.
0
Run Code Online (Sandbox Code Playgroud)

另外,我正在尝试创建一个单独的用户:

> use admin
switched to db admin
db.auth("mongo", "asdfasdf")
1
> db.createUser({
    user: "user",
    pwd: "asdfasdf",
    roles: [  {role: "readWrite", db: "translations" }  ]
    })
Successfully added user: {
        "user" : "user",
        "roles" : [
                {
                        "role" : "readWrite",
                        "db" : "translations"
                }
        ]
}
> use translations
switched to db translations  
> db.auth("user", "asdfasdf")
Error: Authentication failed.
0
Run Code Online (Sandbox Code Playgroud)

同样,我做错了什么???

更新:

root@8bf81ef1fc4f:/# mongo -u mongo -p asdfasdf --authenticationDatabase admin
MongoDB shell version v4.2.3
connecting to: mongodb://127.0.0.1:27017/?authSource=admin&compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("02231489-eaf4-40be-a108-248cec88257e") }
MongoDB server version: 4.2.3
Server has startup warnings: 
2020-02-26T16:24:12.942+0000 I  STORAGE  [initandlisten] 
2020-02-26T16:24:12.943+0000 I  STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2020-02-26T16:24:12.943+0000 I  STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
---
Enable MongoDB's free cloud-based monitoring service, which will then receive and display
metrics about your deployment (disk utilization, CPU, operation statistics, etc).

The monitoring data will be available on a MongoDB website with a unique URL accessible to you
and anyone you share the URL with. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.

To enable free monitoring, run the following command: db.enableFreeMonitoring()
To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---

> db.createUser({user: "someuser", pwd: "asdfasdf", roles: [{role: "readWrite", db: "translations"}]})
Successfully added user: {
        "user" : "someuser",
        "roles" : [
                {
                        "role" : "readWrite",
                        "db" : "translations"
                }
        ]
}
> use translations
switched to db translations
> db.auth("someuser", "asdfasdf")
Error: Authentication failed.
0
> 
Run Code Online (Sandbox Code Playgroud)

Tai*_*sco 24

一段时间后,我想通了。

  • 在同一文件夹中,创建docker-compose.ymlinit-mongo.js

docker-compose.yml

version: '3.7'
services:
  database:
    image: mongo
    container_name : your-cont-name
    command: mongod --auth
    environment:
      - MONGO_INITDB_DATABASE=my_db
      - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD=root
    ports:
      - '27017-27019:27017-27019'
    volumes: 
      - mongodbdata:/data/db
      - ./init-mongo.js:/docker-entrypoint-initdb.d/mongo-init.js:ro
      
volumes:
  mongodbdata:
    driver: local
Run Code Online (Sandbox Code Playgroud)

初始化-mongo.js

db.createUser(
    {
        user: "your_user",
        pwd: "your_password",
        roles: [
            {
                role: "readWrite",
                db: "my_db"
            }
        ]
    }
);
db.createCollection("test"); //MongoDB creates the database when you first store data in that database
Run Code Online (Sandbox Code Playgroud)

授权

首先,在容器内执行bash

docker exec -it your-cont-name bash
Run Code Online (Sandbox Code Playgroud)

现在我们可以登录了。对于管理员

mongo -u admin -p root
Run Code Online (Sandbox Code Playgroud)

对于 your_user 您必须指定数据库(使用 --authenticationDatabase ),否则您将出现身份验证错误

mongo -u your_user -p your_password --authenticationDatabase my_db
Run Code Online (Sandbox Code Playgroud)

之后,您应该切换到正确的数据库

use my_db
Run Code Online (Sandbox Code Playgroud)

如果你不执行这个命令,你将在测试数据库上

笔记

为了确保拥有正确的配置,我更喜欢

docker-compose stop
docker-compose rm
docker volume rm <your-volume>
docker-compose up --build -d
Run Code Online (Sandbox Code Playgroud)

  • 因此,如果您不在入口点( - ./init-mongo.js:/docker-entrypoint-initdb.d/mongo-init.js:ro )中使用 db.createUser() 创建用户,则无法以环境变量中定义的 root 用户身份登录( MONGO_INITDB_DATABASE=my_db、 MONGO_INITDB_ROOT_USERNAME=admin 、 MONGO_INITDB_ROOT_PASSWORD=root )?那么这些环境变量有什么用呢?他们不创建一个具有该 initdb 密码的用户吗?另一个问题,如何在 git 中隐藏密码,你的密码位于这个 .js 文件中? (2认同)

小智 19

我也有同样的问题,google了两个小时终于解决了;\nsolution\xef\xbc\x9a找到挂载到mongodb容器的主机目录,将其删除,然后重新创建mongodb容器。

\n

通过 docker-compose.yaml 创建的 mongo 数据库容器将主机上的目录挂载到容器中以保存 mongo 数据库。当您删除容器时,挂载的目录不会被删除,因此环境变量传递的默认用户名和密码可能是您很久以前设置的,现在您更改用户名和密码。只是不起作用,因为重新创建容器不会重新创建“admin”数据库。

\n


Lin*_*nPy 6

文档中所述

这些变量结合使用,创建一个新用户并设置该用户的密码。该用户是在 admin 身份验证数据库中创建的,并被赋予 root 角色,这是一个“超级用户”角色。

所以你需要添加--authenticationDatabase admin到你的命令中,因为 mongod 将以mongod --auth

例子:

mongo -u mongo -p asdfasdf --authenticationDatabase admin
Run Code Online (Sandbox Code Playgroud)


a_m*_*dev 6

我陷入了这个陷阱,浪费了一天的时间,而一切都是正确的。

我写这篇文章是为了将来的我,因为它在其他地方没有提到,也是为了避免我在设置用户/通行证组合以从其他服务连接到他们的数据库时犯错误。

假设一切都正确:

如果您正在安装一些本地文件夹作为数据库的存储,如下所示:


services:
  your_mongo_db:
    // ...some config

    volumes:
      - ./__TEST_DB_DATA__:/data/db
      - ./init-mongo.js:/docker-entrypoint-initdb.d/mongo-init.js:ro
    environment:
      - "MONGO_INITDB_ROOT_USERNAME=root"
      - "MONGO_INITDB_ROOT_PASSWORD=pass"

    //...more config

Run Code Online (Sandbox Code Playgroud)

请记住在重新运行您的撰写文件之前删除此文件夹。我认为当您第一次运行该docker-compose命令时,Mongo 将创建并存储用户数据(就像任何其他集合一样),然后下次重用它(因为您安装了该卷)。