Spring Boot微服务Docker环境MongoDB普通用户认证失败求助
Spring Boot微服务MongoDB普通用户认证失败(init-mongo.sh未执行)
问题概述
开发的Spring Boot微服务以Docker容器运行,使用MongoDB 6.0.2作为数据库。通过init-mongo.sh和stage_mongo.env创建Root用户与普通用户后,用Root用户能正常连接数据库,但用普通用户连接时触发认证失败错误,且后续发现init-mongo.sh脚本根本未执行。
错误信息
com.mongodb.MongoCommandException: Command failed with error 18 (AuthenticationFailed): 'Authentication failed.' on server mongodb:27017. The full response is {"ok": 0.0, "errmsg": "Authentication failed.", "code": 18, "codeName": "AuthenticationFailed"} at com.mongodb.internal.connection.ProtocolHelper.getCommandFailureException(ProtocolHelper.java:198) ~[mongodb-driver-core-4.6.0.jar!/:na] at com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:413) ~[mongodb-driver-core-4.6.0.jar!/:na] at com.mongodb.internal.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:337) ~[mongodb-driver-core-4.6.0.jar!/:na] at com.mongodb.internal.connection.CommandHelper.sendAndReceive(CommandHelper.java:101) ~[mongodb-driver-core-4.6.0.jar!/:na] at com.mongodb.internal.connection.CommandHelper.executeCommand(CommandHelper.java:45) ~[mongodb-driver-core-4.6.0.jar!/:na] at com.mongodb.internal.connection.SaslAuthenticator.sendSaslStart(SaslAuthenticator.java:230) ~[mongodb-driver-core-4.6.0.jar!/:na] at com.mongodb.internal.connection.SaslAuthenticator.getNextSaslResponse(SaslAuthenticator.java:137) ~[mongodb-driver-core-4.6.0.jar!/:na]
核心原因与解决方案
1. 清理MongoDB已有数据(脚本执行的前提)
MongoDB容器的docker-entrypoint-initdb.d目录下的初始化脚本仅在首次启动(/data/db目录为空)时执行一次。如果之前已经启动过MongoDB并生成了数据,脚本不会重复运行。
执行以下操作重置数据:
# 停止并移除容器 docker-compose down # 删除本地挂载的MongoDB数据目录 rm -rf ../mongodb/db # 重新启动容器 docker-compose up -d
2. 修复init-mongo.sh脚本(适配MongoDB 6.0+)
MongoDB 6.0及以上版本已移除旧的mongo命令行工具,改用mongosh,原脚本会因命令不存在而执行失败。修改后的脚本如下:
#!/bin/bash mongosh -- "$MONGO_INITDB_DATABASE" <<EOF var rootUser = '$MONGO_INITDB_ROOT_USERNAME'; var rootPassword = '$MONGO_INITDB_ROOT_PASSWORD'; var admin = db.getSiblingDB('admin'); admin.auth(rootUser, rootPassword); var user = '$MONGO_INITDB_USERNAME'; var passwd = '$MONGO_INITDB_PASSWORD'; db.createUser({user: user, pwd: passwd, roles: ["readWrite"]}); EOF
同时给脚本添加执行权限:
chmod +x ./init-mongo.sh
3. 验证普通用户是否创建成功
容器启动后,进入MongoDB容器检查用户状态:
# 用Root用户登录MongoDB docker exec -it <你的mongodb容器名> mongosh -u someRootName -p someRootPassword --authenticationDatabase admin # 切换到目标数据库 use someDatabaseName # 查询当前库下的用户 db.getUsers()
如果能看到someName用户,说明创建成功;若未找到,检查数据目录是否清理干净、脚本是否存在语法错误。
4. 补全Spring Boot连接配置
确保Spring Boot的MongoDB连接配置完整,避免因参数缺失导致认证失败。修改stage_mongo_auth.env,推荐用URI方式配置:
spring_data_mongodb_uri=mongodb://someName:somePassword@mongodb:27017/someDatabaseName?authSource=someDatabaseName
或补全分散配置项:
spring_data_mongodb_username=someName spring_data_mongodb_password=somePassword spring_data_mongodb_database=someDatabaseName spring_data_mongodb_authentication-database=someDatabaseName
5. 排查容器日志与环境变量
- 查看MongoDB容器日志,确认脚本执行是否有报错:
docker logs <你的mongodb容器名> - 验证MongoDB容器是否正确接收了环境变量:
docker exec -it <你的mongodb容器名> env | grep MONGO_INITDB
内容的提问来源于stack exchange,提问作者Oleksandr Popov
相关产品推荐
相关产品推荐

