Mongodb 与 docker-compose - 创建用户

Krz*_*ski 6 mongodb docker spring-boot docker-compose

这是我的 docker-compose.yaml:

version: "2.0"
services:
  mongo_container:
    image: mongo:latest
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
      MONGO_INITDB_DATABASE: testdb
    ports:
      - "27017:27017"
    volumes:
      - ./mongodata:/data/db
Run Code Online (Sandbox Code Playgroud)

这在我的弹簧配置中:

spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.username=root
spring.data.mongodb.password=example
spring.data.mongodb.database=testdb
Run Code Online (Sandbox Code Playgroud)

但是每次当我尝试将我的应用程序连接到 Mongo 时,我都会在 Docker 控制台中收到以下错误:

mongo_container_1  | 2020-03-31T07:37:24.803+0000 I  ACCESS   [conn2] SASL SCRAM-SHA-1 authentication failed for root on testdb from client 172.29.0.1:36628 ; UserNotFound: Could not find user "root" for db "testdb"
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?我尝试删除所有容器并docker system prune再次运行它,但它仍然给出相同的错误。

mat*_*Pen 4

您需要在 application.properties 中添加以下行:

spring.data.mongodb.authentication-database=admin
Run Code Online (Sandbox Code Playgroud)

来自 docker-hub mongodb 自述文件

MONGO_INITDB_ROOT_USERNAME、MONGO_INITDB_ROOT_PASSWORD

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

对于数据库:

MONGO_INITDB_DATABASE 此变量允许您指定用于在 /docker-entrypoint-initdb.d/*.js 中创建脚本的数据库名称... MongoDB 基本上是为“首次使用时创建”而设计的,所以如果您这样做不使用 JavaScript 文件插入数据,则不会创建数据库。

在 MongoDB 中,启用身份验证后,您总是针对特定数据库(默认为 admin)进行身份验证,然后连接并使用另一个数据库。这就是为什么有两种不同的属性:身份验证数据库(用于身份验证)和数据库(要使用的属性)