Docker环境MongoDB 6.0初始化失败:认证错误问题求助
Docker下MongoDB 6.0数据库初始化方案
问题原因
你的初始化脚本在MongoDB 6.0中认证失败,核心原因是:脚本执行时默认连接的是test数据库,调用db.auth()会尝试在当前数据库(test)下认证admin用户,但你的root用户是创建在admin数据库中的,因此导致认证失败。MongoDB 6.0对认证上下文的校验更严格,之前5.0的隐式兼容逻辑不再生效。
修正方案
方案一:修正JS脚本
直接修改原init-mongo.js,先切换到admin数据库再执行认证,确保上下文正确:
// 切换到root用户所在的admin数据库 use admin; // 认证root用户 db.auth("admin", "MyPassw0rd_123"); // 切换到目标业务数据库 db = db.getSiblingDB("RecipientService"); // 创建业务集合 db.createCollection('RecipientAggregate'); // 创建业务用户 db.createUser({ user: "wfuser", pwd: "MyPassw0rd_", roles: [{ role: "readWrite", db: "RecipientService" }] });
方案二:使用Shell脚本调用mongosh
如果担心JS脚本的兼容性问题,可以改用.sh脚本,直接通过mongosh命令行参数指定认证信息,避免脚本内的上下文混淆:
创建init-mongo.sh文件,内容如下:
#!/bin/bash mongosh admin -u admin -p MyPassw0rd_123 <<EOF use RecipientService; db.createCollection('RecipientAggregate'); db.createUser({ user: "wfuser", pwd: "MyPassw0rd_", roles: [{ role: "readWrite", db: "RecipientService" }] }); EOF
给脚本添加执行权限:chmod +x init-mongo.sh,再挂载到容器的/docker-entrypoint-initdb.d/目录。
容器启动配置
无论用哪种方案,启动MongoDB 6.0容器时必须设置root用户的环境变量,确保初始化阶段创建好root用户。以docker-compose为例:
version: '3.8' services: mongodb: image: mongo:6.0 environment: MONGO_INITDB_ROOT_USERNAME: admin MONGO_INITDB_ROOT_PASSWORD: MyPassw0rd_123 volumes: # 替换为你的脚本路径,JS脚本写./init-mongo.js,Shell脚本写./init-mongo.sh - ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js - mongodb_data:/data/db ports: - "27017:27017" volumes: mongodb_data:
内容的提问来源于stack exchange,提问作者Oscar
相关产品推荐
相关产品推荐

