如何为Docker Compose中的MongoDB root用户设置账号密码
解决Docker Compose部署MongoDB的Root用户密码设置问题
问题核心原因
MongoDB官方镜像的初始化逻辑(包括MONGO_INITDB_ROOT_USERNAME/MONGO_INITDB_ROOT_PASSWORD环境变量、/docker-entrypoint-initdb.d/下的脚本)仅在容器首次启动且/data/db目录为空时执行。你的Mongo容器已经挂载了持久化数据卷./mongo/data,之前添加环境变量时未触发初始化流程,所以root用户未被创建。同时当前Mongo未启用身份验证,导致无需密码即可连接。
分步解决方案
1. 先备份现有数据(务必执行)
防止操作过程中数据丢失,先停止容器并备份数据:
# 停止Mongo容器 docker-compose stop mongo # 备份数据目录 cp -r ./mongo/data ./mongo/data_backup
2. 修改docker-compose.yml配置
更新mongo服务的环境变量,添加root用户信息,并启用身份验证:
mongo: image: mongo:4.4 container_name: mongo restart: unless-stopped ports: - '27027:27017' environment: - MONGO_INITDB_DATABASE=transport - MONGO_INITDB_ROOT_USERNAME=root - MONGO_INITDB_ROOT_PASSWORD=your_strong_root_password # 替换为你的强密码 command: mongod --auth # 强制开启身份验证 volumes: - ./mongo/data:/data/db/ - ./mongo/log:/var/log/mongodb/ - ./mongo/init/mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js networks: - main-network
3. 重置Mongo初始化环境(可选,需重新创建用户)
如果要让镜像重新执行初始化脚本(包括创建root和原admin用户),需要清理现有数据卷内容:
# 删除Mongo容器 docker-compose rm -f mongo # 清空数据目录(已备份,可放心操作) rm -rf ./mongo/data/*
4. 重启Mongo容器
docker-compose up -d mongo
此时容器会重新执行初始化流程:自动创建root超级用户(拥有所有数据库权限),同时执行mongo-init.js创建原有的admin读写用户。
5. 验证身份验证效果
通过容器内Shell验证
# 进入Mongo容器,用root用户登录(认证库为admin) docker exec -it mongo mongosh -u root -p your_strong_root_password --authenticationDatabase admin # 登录成功后查看所有用户 use admin db.getUsers()
通过MongoDB Compass验证
使用带认证的连接字符串:
mongodb://root:your_strong_root_password@localhost:27027/?authSource=admin
或者用原有admin用户连接transport数据库:
mongodb://admin:password@localhost:27027/transport?authSource=transport
6. 更新Spring Boot应用配置
修改application.properties中的Mongo连接地址,添加认证信息:
# 推荐使用最小权限的admin用户 spring.data.mongodb.uri=mongodb://admin:password@mongo:27017/transport?authSource=transport # 若需用root用户(不推荐,避免权限过大) # spring.data.mongodb.uri=mongodb://root:your_strong_root_password@mongo:27017/transport?authSource=admin
备选方案(无需清空数据)
如果不想重置现有数据,可以手动进入容器创建root用户,再开启身份验证:
# 进入Mongo容器(当前无认证) docker exec -it mongo mongosh # 切换到admin库创建root用户 use admin db.createUser({ user: "root", pwd: "your_strong_root_password", roles: [{ role: "root", db: "admin" }] }) # 退出后停止容器,修改docker-compose.yml添加--auth命令,再重启
内容的提问来源于stack exchange,提问作者victor.ja
相关产品推荐
相关产品推荐

