繁体   English   中英

mongo db docker 镜像认证失败

[英]mongo db docker image authentication failed

我在本地 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

我还尝试从容器内部运行 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

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

> 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

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

更新:

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
> 

文档中所述

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

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

例子:

mongo -u mongo -p asdfasdf --authenticationDatabase admin

一段时间后,我想通了。

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

码头工人-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

初始化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

认证

首先,在容器内执行bash

docker exec -it your-cont-name bash

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

mongo -u admin -p root

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

mongo -u your_user -p your_password --authenticationDatabase my_db

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

use my_db

如果您不执行此命令,您将在test db

笔记

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

docker-compose stop
docker-compose rm
docker volume rm <your-volume>
docker-compose up --build -d

我有同样的问题,谷歌两个小时后终于解决了; 解决方法:找出挂载到mongodb容器的宿主机目录,删除,然后重新创建mongodb容器。

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

我自己也有同样的问题,

请首先从凭据中删除用户名和密码。

environment:
      MONGO_INITDB_ROOT_USERNAME: mongo
      MONGO_INITDB_ROOT_PASSWORD: asdfasdf

删除凭据后,您可以检查 dbs 或 mongodb 上的用户。

show dbs
show users

这些命令也需要身份验证,所以如果你能看到它们,可以为空,然后你就解决了你的问题。

然后,创建一个管理员用户,

use admin
db.createUser({user: "root", pwd: "root", roles:["root"]})

然后您可以注销并尝试以管理员身份使用凭据连接到 shell。

此外,如果您在创建新用户方面仍有一些问题,在我的情况下,我将机制更改为 SCRAM-SHA-1,而不是像魅力一样工作。

{
  user: "<name>",
  pwd: passwordPrompt(),      // Or  "<cleartext password>"
  customData: { <any information> },
  roles: [
    { role: "<role>", db: "<database>" } | "<role>",
    ...
  ],
  authenticationRestrictions: [
     {
       clientSource: ["<IP>" | "<CIDR range>", ...],
       serverAddress: ["<IP>" | "<CIDR range>", ...]
     },
     ...
  ],
  mechanisms: [ "<SCRAM-SHA-1|SCRAM-SHA-256>", ... ],
  passwordDigestor: "<server|client>"
}

我掉进了这个陷阱,像一天一样瘦下来,而一切都是正确的。

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

假设一切都是正确的:👇

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


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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM