所以我尝试使用官方mongo Docker 镜像version来设置 MongoDB 4.2。
我想要实现的是使用启用了身份验证的服务器,并且我想要一个带有自定义用户和密码的自定义数据库。
因此,我设置以下环境变量:
MONGO_INITDB_DATABASE: mydb
MONGO_INITDB_ROOT_USERNAME: jane
MONGO_INITDB_ROOT_PASSWORD: secret
Run Code Online (Sandbox Code Playgroud)
在文档中,它指出如果您提供后两个环境变量,则会自动启用身份验证。
但是,当我尝试mydb使用凭据jane和访问数据库时secret,我得到的只是一个错误:
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"
Run Code Online (Sandbox Code Playgroud)
这是为什么?我缺少什么?
我的猜测是创建的用户只能访问数据库admin,我需要授予该用户jane对数据库的访问权限mydb。我尝试使用以下命令来做到这一点:
mongo admin -u jane -p secret --eval "db.grantRolesToUser('jane', [{role: 'dbOwner', db: 'mydb'}])"
Run Code Online (Sandbox Code Playgroud)
但这也不起作用。我缺少什么?
您可以使用jane进行身份验证,对admin db 进行秘密验证,而不是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 脚本中切换数据库。
| 归档时间: |
|
| 查看次数: |
10200 次 |
| 最近记录: |