如何通过docker-compose开启MongoDB认证?遇用户未找到问题求助
我来帮你分析下问题所在,然后给你两个不需要构建自定义镜像的解决方案:
问题根源
你配置的MONGO_INITDB_ROOT_USERNAME=backend和MONGO_INITDB_ROOT_PASSWORD=123456,其实是在admin数据库创建了一个名为backend的超级用户(root权限),而你的后端服务尝试在backend数据库上用backend@backend这个用户做认证——但这个用户根本不存在于backend库,所以才会报错UserNotFound: Could not find user backend@backend。
解决方案1:调整后端连接字符串(最快)
不需要修改docker-compose配置,只需要把后端的MongoDB连接字符串改成指定认证源为admin库:
// 示例Node.js连接字符串(适配你的驱动版本) mongoose.connect('mongodb://backend:123456@mongo-db:27017/backend?authSource=admin', { useNewUrlParser: true, useUnifiedTopology: true });
这里的authSource=admin告诉MongoDB去admin数据库验证这个用户的身份,因为你的超级用户是存在admin库的。
解决方案2:在backend库创建专用用户(更规范)
如果你不想用root权限的用户连接业务数据库,可以通过挂载初始化脚本的方式,让MongoDB自动在backend库创建专用用户,不需要自定义镜像:
- 在项目根目录创建
init-mongo.js脚本,内容如下:
// 切换到backend数据库 use backend; // 创建拥有读写权限的backend用户 db.createUser({ user: "backend", pwd: "123456", roles: [{ role: "readWrite", db: "backend" }] });
- 修改你的docker-compose.yml,给mongo-db服务添加volume挂载这个脚本:
version: "2" services: mongo-db: image: "mongo:3.6.0" container_name: mongo-db ports: - 27017:27017 environment: - MONGO_INITDB_ROOT_USERNAME=backend - MONGO_INITDB_ROOT_PASSWORD=123456 - MONGO_INITDB_DATABASE=backend command: mongod --bind_ip 0.0.0.0 volumes: - ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js # 新增挂载配置 backend: build: context: . container_name: backend ports: - 3030-3039:3030-3039 depends_on: - mongo-db
- 重要注意事项:如果你之前已经启动过MongoDB容器,本地可能已经存在旧的数据卷,初始化脚本不会重新执行。需要先清理旧卷再启动:
docker-compose down -v docker-compose up -d
这样之后,你的后端就可以直接用mongodb://backend:123456@mongo-db:27017/backend连接,不需要指定authSource,因为用户已经存在于backend库了。
关于镜像更新:mongo:3.6.0是比较旧的版本了,不过你的问题和版本无关,是认证逻辑的问题。如果想要更新,可以换成mongo:latest或者更高的稳定版本(比如4.4、5.0系列),配置方式是一致的。
内容的提问来源于stack exchange,提问作者Victor

