MONGO DB 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

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

过了一段时间,我想通了。

  • 在同一文件夹中,创建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

init-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

如果不执行此命令,您将在测试数据库上

注意

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

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

我有同样的问题,在谷歌两个小时之后终于松懈了; 解决方案:找出挂载到MongoDB容器中的主机direcory,将其删除,然后重新创建MongoDB容器。

由 Docker-Compose.yaml 创建的 Mongo DB 容器 从主机机甲挂载一个 diretory 到容器中以保存 mongo datbases。 当您删除容器时,不会删除 moued direcotry,因此 env var 传递的默认用户名和密码可能是您很久以前设置的,现在您更改用户名和密码。 只是不工作,因为重新创建容器不会重新创建"admin"数据库。

如文档中所述

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

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

例:

mongo -u mongo -p asdfasdf --authenticationDatabase admin

我掉进了这个陷阱,浪费了一天,而一切都是正确的。

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

假设一切正常: 👇

如果要挂载某些本地文件夹作为数据库的存储,如下所示:


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 将在那里创建并存储用户数据(就像任何其他集合一样),然后在下次重复使用它(因为您挂载了该卷)。

我自己也有同样的问题,请按照以下步骤操作: 步骤 1 和 2 是 删除 de 旧配置,然后设置并应用新配置,它非常重要:

  1. 删除到容器mongodocker rm mongo -f
  2. 如果已创建卷,请将其删除:docker volume rm $(docker volume ls -q) -f
  3. 在 docker-compose.yml 集的端口字段中: - 27018:27017 -> 端口不是 27017:27017非常重要,就我而言,它会产生冲突。
  4. 向上 docker 组成:docker-compose up
  5. 立即尝试使用身份验证进行连接!

docker-compose.yml 的例子:

mongo:
container_name: mongo
image: mongo:4.4
restart: always
environment:
TZ: "Europe/Madrid"
MONGO_INITDB_ROOT_USERNAME: "user"
MONGO_INITDB_ROOT_PASSWORD: "admin1"
volumes:
- ./mongoDataBase:/data/db        
ports:
- 27018:27017 

此致敬意!

我自己也有同样的问题,

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

environment:
MONGO_INITDB_ROOT_USERNAME: mongo
MONGO_INITDB_ROOT_PASSWORD: asdfasdf

删除凭据后,您可以检查MongoDB上的数据库或用户。

show dbs
show users

这些命令也需要身份验证,因此如果您可以看到它们,可以为 null,那么您就可以解决问题。

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

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

然后,您可以注销并尝试以管理员身份使用凭据连接到命令行管理程序。

此外,如果您在创建新用户时仍然遇到一些问题, 就我而言,我将机制更改为 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>"
}

错误可能与docker卷有关,请尝试删除旧的卷并在docker-compose.yaml中创建一个新卷。我认为这与设置您的用户名并传递给静态文件的初始脚本有关,因此您需要重新创建它

最新更新