You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Compose整合Spring Boot与MongoDB时认证失败问题

问题:Spring Boot + Docker Compose 连接MongoDB身份验证失败

现象

  • MongoDB日志提示admin数据库中找不到用户rootuser,但Mongo Express中该用户存在于admin库
  • Spring Boot无法通过配置的用户名密码连接MongoDB

相关配置文件

docker-compose.yaml

version: "3.8"
services:
  mongodb:
    image: mongo
    container_name: mongodb
    ports:
      - 27017:27017
    volumes:
      - ./001_users.js:/docker-entrypoint-initdb.d/001_users.js:ro
      - data:/data
    environment:
      - MONGO_INITDB_ROOT_USERNAME=rootuser
      - MONGO_INITDB_ROOT_PASSWORD=rootpass
  mongo-express:
    image: mongo-express
    container_name: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      - ME_CONFIG_MONGODB_ADMINUSERNAME=rootuser
      - ME_CONFIG_MONGODB_ADMINPASSWORD=rootpass
      - ME_CONFIG_MONGODB_SERVER=mongodb
volumes:
  data: {}

networks:
  default:
    name: mongodb_network

application.properties

spring.data.mongodb.authentication-database=admin
spring.data.mongodb.username=rootuser
spring.data.mongodb.password=rootpass
spring.data.mongodb.database=foober
spring.data.mongodb.port=27017
spring.data.mongodb.host=localhost
spring.data.mongodb.auto-index-creation=true

尝试的初始化脚本(001_users.js)

db.createUser(
    {
        user: "rootuser",
        pwd: "rootpass",
        roles:[
            {
                role: "readWrite",
                db:   "foober"
            }
        ]
    }
);

问题原因

  1. 初始化脚本执行逻辑冲突:设置MONGO_INITDB_ROOT_USERNAME和MONGO_INITDB_ROOT_PASSWORD时,MongoDB会自动在admin库创建超级用户rootuser;而初始化脚本未指定目标库,默认会在test库创建同名用户,导致用户数据混乱。
  2. 旧数据卷残留:若之前运行过容器,MongoDB数据卷已存在数据,初始化脚本仅会在首次启动(数据目录为空)时执行,后续启动不会重新执行,导致用户配置未更新。

解决方案

1. 清理旧数据卷

MongoDB初始化脚本仅在首次启动且数据目录为空时执行,需清理残留的旧数据卷:

# 停止并删除容器
docker-compose down
# 删除项目关联的数据卷(替换<你的项目名>为实际项目目录名)
docker volume rm <你的项目名>_data

2. 修正初始化脚本(可选)

若需为foober库创建专用读写用户,避免与admin库超级用户冲突,修改脚本:

// 切换到foober库
use foober;
db.createUser(
    {
        user: "foober_user",
        pwd: "foober_pass",
        roles: [{ role: "readWrite", db: "foober" }]
    }
);

同步修改application.properties:

spring.data.mongodb.authentication-database=foober
spring.data.mongodb.username=foober_user
spring.data.mongodb.password=foober_pass

3. 验证连接配置

  • 若Spring Boot在宿主机本地运行:host=localhost配置有效
  • 若Spring Boot也以Docker容器运行:需将host改为mongodb(Docker服务名),并确保Spring Boot容器加入mongodb_network网络

4. 重新启动容器

docker-compose up -d

内容的提问来源于stack exchange,提问作者Vladan Mikic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 15:05:19