Docker Compose部署MongoDB时出现UserNotFound认证错误
Docker Compose部署MongoDB时出现UserNotFound认证错误
看起来你遇到的是MongoDB认证时的用户找不到问题,我帮你梳理下原因和解决办法~
首先得明确一个容易踩的坑:你在环境变量里设置了MONGO_INITDB_DATABASE: DB,这个变量是用来指定初始化脚本(如果有的话)运行的目标数据库,但root用户eagle是默认创建在admin系统数据库下的,并不是你指定的DB库。如果你的连接工具或代码直接用DB作为认证数据库,就会出现找不到用户的认证失败问题。
下面给你两种解决思路:
方法1:连接时明确指定认证数据库为admin
不管用命令行还是客户端工具,连接时要加上authSource=admin参数,告诉MongoDB去admin库找你的root用户。比如用mongosh命令连接的话:mongosh "mongodb://eagle:123@localhost:27017/DB?authSource=admin"如果是代码里的连接字符串,同样要加上这个参数,就能正常认证了。
方法2:创建DB库的专用业务用户(推荐)
为了更安全,也避免每次连接都要指定authSource,你可以给DB库创建一个专用用户,步骤如下:- 新建一个本地目录
./mongo-init,在里面创建初始化脚本init-user.js:// 切换到目标DB库 db = db.getSiblingDB('DB'); // 创建该库的专用用户,赋予库所有者权限 db.createUser({ user: 'eagle_db', pwd: '123', roles: [{ role: 'dbOwner', db: 'DB' }] }); - 修改你的docker-compose.yml,把脚本目录挂载到MongoDB容器的初始化目录(容器会自动执行这里的脚本):
version: '3.9' services: mongo: image: mongo:latest restart: always container_name: mongodb ports: - '27017:27017' volumes: - mongodb:/data/db - ./mongo-init:/docker-entrypoint-initdb.d # 新增这一行挂载初始化脚本 environment: MONGO_INITDB_ROOT_USERNAME: eagle MONGO_INITDB_ROOT_PASSWORD: 123 MONGO_INITDB_DATABASE: DB volumes: mongodb: {} - 因为MongoDB的初始化脚本只会在第一次创建数据卷时执行,所以需要先删除旧数据卷再重启:
docker-compose down -v - 重新启动容器:
docker-compose up -d
之后你就可以直接用
eagle_db用户连接DB库,无需额外指定认证数据库了。- 新建一个本地目录
另外要注意:如果之前已经启动过容器,只修改配置是没用的,必须删除数据卷才能触发重新初始化流程。
备注:内容来源于stack exchange,提问作者Raúl Peñate
相关产品推荐
相关产品推荐

