Docker Compose搭建MongoDB微服务:连接Compass失败及用户不存在问题
问题:MongoDB Compass连接Docker容器内MongoDB报错UserNotFound
我是Docker容器与Docker-compose的新手,正在使用MongoDB和Docker-compose构建聊天微服务,但无法通过MongoDB Compass连接,报错:error":"UserNotFound: Could not find user \"root\" for db \"admin\"
我的docker-compose配置文件如下:
version: "3" services: chat-service: build: "./chat-service" depends_on: - chat-service-db volumes: - ./chat-service:/opt/app chat-service-db: environment: - MONGO_INITDB_ROOT_USERNAME=root - MONGO_INITDB_ROOT_PASSWORD=password - MONGO_INITDB_DATABASE=chatservice image: mongo ports: - 0.0.0.0:27017:27017 user-service: build: "./user-service" depends_on: - user-service-db volumes: - ./user-service:/opt/app user-service-db: environment: - MONGO_INITDB_ROOT_USERNAME=root - MONGO_INITDB_ROOT_PASSWORD=password - MONGO_INITDB_DATABASE=userservice image: mongo ports: - 0.0.0.0:27018:27017
原因分析
- MongoDB用户创建逻辑:
MONGO_INITDB_ROOT_USERNAME和MONGO_INITDB_ROOT_PASSWORD是用来创建admin数据库的超级用户,MONGO_INITDB_DATABASE只是指定容器启动时默认连接的数据库,不会在该库创建root用户。 - 旧数据卷缓存:如果之前启动过容器,MongoDB的数据卷可能已经存在,初始化脚本只会在第一次创建容器时执行,后续启动不会重新生成用户。
- Compass连接配置错误:连接时可能选错了认证数据库,root用户的认证库是
admin,不是你设置的chatservice或userservice。
解决步骤
1. 修正Compass连接参数
连接时按以下配置填写:
- 连接字符串:
mongodb://root:password@localhost:27017/?authSource=admin(对应chat-service-db,端口换成27018则是user-service-db) - 手动配置:用户名填
root,密码填password,认证数据库选择admin,端口对应容器映射的27017/27018。
2. 清理旧数据卷(若之前启动过容器)
如果之前的容器已经生成过数据卷,初始化脚本不会重新运行,需要删除旧数据卷重置:
# 停止并删除所有容器 docker-compose down # 删除MongoDB相关数据卷(会清空所有数据,谨慎操作) docker volume rm $(docker volume ls -q | grep chat-service-db) docker volume rm $(docker volume ls -q | grep user-service-db) # 重新启动容器 docker-compose up -d
3. 可选:为业务库创建专用用户(按需)
如果需要在chatservice或userservice库创建专用操作用户,可以添加初始化脚本:
- 新建
chat-service-db-init目录,里面创建init-mongo.js脚本:
db.createUser({ user: "chat_user", pwd: "chat_pass", roles: [{ role: "readWrite", db: "chatservice" }] });
- 修改
chat-service-db的docker-compose配置,挂载初始化脚本并添加命名卷:
chat-service-db: environment: - MONGO_INITDB_ROOT_USERNAME=root - MONGO_INITDB_ROOT_PASSWORD=password - MONGO_INITDB_DATABASE=chatservice image: mongo ports: - 0.0.0.0:27017:27017 volumes: - ./chat-service-db-init/init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js - chat_db_data:/data/db # 用命名卷持久化数据
- 对
user-service-db执行同样的操作,创建对应的初始化脚本和卷配置。
内容的提问来源于stack exchange,提问作者Kartik Fulara
相关产品推荐
相关产品推荐

