Docker中MongoDB部署自动化:如何用配置文件初始化用户?
解决MongoDB初始化脚本读取独立JSON配置的问题
因为MongoDB的初始化脚本是运行在Mongo Shell环境下的,不是Node.js runtime,所以你用Node.js风格的require()或fs模块读配置肯定没用,得用Mongo Shell内置的方法来实现。下面是具体步骤:
1. 准备独立的config.json配置文件
在scripts目录下创建config.json,把需要的参数写进去:
{ "adminDb": "admin", "adminUser": "db_admin", "adminPwd": "your_admin_pass_123", "appDbName": "my_business_db", "appUser": "app_operator", "appPwd": "your_app_pass_456" }
2. 修改init-mongodb.js脚本
用Mongo Shell的cat()读取文件内容,再用JSON.parse()解析成配置对象,替换硬编码的参数:
// 读取容器内的配置文件路径(对应docker挂载的路径) const configText = cat('/docker-entrypoint-initdb.d/scripts/config.json'); const config = JSON.parse(configText); // 创建管理员用户 const adminDb = db.getSiblingDB(config.adminDb); adminDb.createUser({ user: config.adminUser, pwd: config.adminPwd, roles: ["root"] }); // 切换到业务数据库,创建应用用户 const appDb = db.getSiblingDB(config.appDbName); appDb.createUser({ user: config.appUser, pwd: config.appPwd, roles: [ { role: "readWrite", db: config.appDbName } ] }); print("✅ 数据库用户初始化完成,已应用配置文件参数");
3. 调整docker-compose.yml的挂载配置
确保scripts目录(包含init-mongodb.js和config.json)正确挂载到MongoDB容器的初始化脚本目录:
version: '3.8' services: mongodb: image: mongo:4.4 ports: - "27017:27017" volumes: # 挂载本地scripts目录到容器的初始化脚本目录 - ./scripts:/docker-entrypoint-initdb.d/scripts/ # 持久化数据库数据 - mongodb_data:/data/db # 如果不需要默认root用户,可以删掉下面两行 environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: root_pass volumes: mongodb_data:
关键注意点
- 容器内的配置文件路径要和挂载路径一致,否则
cat()会找不到文件; - MongoDB 4.4的Shell原生支持
cat()和JSON.parse(),不用额外依赖; - 如果你的docker-compose里配置了默认的root用户,脚本里创建管理员前需要先执行
adminDb.auth('root', 'root_pass')认证,否则会报错。
内容的提问来源于stack exchange,提问作者Роман Тимохов
相关产品推荐
相关产品推荐

