3

所以我正在尝试使用官方的mongo Docker 映像版本来设置 MongoDB 4.2

我想要实现的是使用启用了身份验证的服务器,并且我想要一个具有自定义用户和密码的自定义数据库。

所以,我正在设置以下环境变量:

MONGO_INITDB_DATABASE: mydb
MONGO_INITDB_ROOT_USERNAME: jane
MONGO_INITDB_ROOT_PASSWORD: secret

在文档中它指出,如果您提供后两个环境变量,则会自动启用身份验证。

但是,当我尝试mydb使用凭据访问数据库janesecret,我得到的只是一个错误:

Supported SASL mechanisms requested for unknown user 'jane@mydb'
SASL SCRAM-SHA-1 authentication failed for jane on mydb from client 172.17.0.1:54702 ; UserNotFound: Could not find user "jane" for db "mydb"

这是为什么?我错过了什么?

我的猜测是创建的用户只能访问admin数据库,我需要授予用户访问jane数据库的权限mydb。我尝试使用以下命令来做到这一点:

mongo admin -u jane -p secret --eval "db.grantRolesToUser('jane', [{role: 'dbOwner', db: 'mydb'}])"

但这也不起作用。我错过了什么?

4

1 回答 1

3

您可以使用jane进行身份验证,针对admin db 的secret ,而不是mydb

跑步mongo -u jane -p secret相当于跑步mongo -u jane -p secret -authenticationDatabase admin。检查容器日志以验证它。

MONGO_INITDB_DATABASE 用于不同的目的。

正如文档所述

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

MONGO_INITDB_DATABASE 此变量允许您指定用于在 /docker-entrypoint-initdb.d/*.js 中创建脚本的数据库名称(请参阅下面的初始化新实例)。MongoDB 基本上是为“首次使用时创建”而设计的,因此如果您不使用 JavaScript 文件插入数据,则不会创建数据库。

初始化一个新 实例当一个容器第一次启动时,它将执行 /docker-entrypoint-initdb.d 中的扩展名为 .sh 和 .js 的文件。文件将按字母顺序执行。.js 文件将由 mongo 使用 MONGO_INITDB_DATABASE 变量指定的数据库(如果存在)执行,否则进行测试。您还可以在 .js 脚本中切换数据库。

于 2019-10-19T09:05:39.307 回答