使用docker-compose启动MongoDB容器后指定库名连接失败该如何解决
解决方案
方案1:直接修改mongoose连接配置(无需调整MongoDB侧配置,即时生效)
你创建的admin用户默认存储在admin系统库中,连接串指定journalDB后默认会从目标库校验用户,仅需显式指定校验用户的数据源为admin库即可,两种写法二选一:
- 写法1:直接在连接串末尾加
authSource参数
mongoose .connect("mongodb://admin:password@localhost:27017/journalDB?authSource=admin", { useNewUrlParser: true, useUnifiedTopology: true, })
- 写法2:在mongoose连接参数中添加
authSource配置
mongoose .connect("mongodb://admin:password@localhost:27017/journalDB", { useNewUrlParser: true, useUnifiedTopology: true, authSource: "admin" })
方案2:在journalDB库下创建独立用户(无需每次连接加authSource参数,需调整docker初始化配置)
如果你希望连接串不需要额外加参数,可以直接在目标库journalDB下创建对应用户,操作步骤如下:
- 在你的docker-compose.yml同级目录下创建初始化脚本
init-mongo.js,内容如下:
// 切换到journalDB库 db = db.getSiblingDB('journalDB') // 创建对应权限的用户 db.createUser({ user: "admin", pwd: "password", roles: [ { role: "readWrite", db: "journalDB" }, // 可根据需求额外添加dbAdmin等其他权限角色 ] })
- 修改你的docker-compose.yml配置,将初始化脚本挂载到MongoDB容器的
/docker-entrypoint-initdb.d/目录下,MongoDB容器首次启动时会自动执行该目录下的所有js脚本,配置参考片段:
services: mongodb: image: mongo:latest environment: MONGO_INITDB_ROOT_USERNAME: admin MONGO_INITDB_ROOT_PASSWORD: password ports: - "27017:27017" volumes: # 挂载初始化脚本 - ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js:ro # 原有数据卷挂载保留即可 - mongo-data:/data/db volumes: mongo-data:
- 清理原有MongoDB容器和数据卷(注意:该操作会清空现有MongoDB内所有数据,如有重要数据请提前备份),执行命令:
docker-compose down -v - 重新启动容器:
docker-compose up -d
配置完成后,你原本的无额外参数的mongoose连接代码即可正常使用。
内容的提问来源于stack exchange,提问作者Aso Amarachi
相关产品推荐
相关产品推荐

