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" } ] } );
问题原因
- 初始化脚本执行逻辑冲突:设置
MONGO_INITDB_ROOT_USERNAME和MONGO_INITDB_ROOT_PASSWORD时,MongoDB会自动在admin库创建超级用户rootuser;而初始化脚本未指定目标库,默认会在test库创建同名用户,导致用户数据混乱。 - 旧数据卷残留:若之前运行过容器,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
相关产品推荐
相关产品推荐

