Spring Boot Docker容器无法连接MongoDB Docker容器数据库
Spring Boot容器连接带认证MongoDB容器的异常解决
问题核心
你遇到的Exception in monitor thread while connecting to server database:27017错误,本质是Spring Boot使用root用户连接product-db数据库时权限不足,再加上容器启动顺序不同步,导致连接验证失败。
解决方案步骤
1. 为目标数据库创建专用权限用户
MongoDB的root用户默认仅拥有admin数据库的最高权限,直接用它连接product-db会触发权限校验失败。需要通过初始化脚本创建对应数据库的专用用户:
编写mongo-init.js脚本
在docker-compose同级目录创建该文件,内容如下:
// 切换到admin库,用root用户登录 db = db.getSiblingDB('admin'); db.auth('admin_username', 'admin_password'); // 切换到目标数据库,创建拥有完整权限的专用用户 db = db.getSiblingDB('product-db'); db.createUser({ user: 'product_user', pwd: 'product_password', roles: [{ role: 'dbOwner', db: 'product-db' }] });
修改docker-compose.yml挂载初始化脚本
注意:挂载时要指定文件路径而非目录(这是你之前出现“目录已存在”错误的原因),同时添加健康检查确保MongoDB服务完全就绪:
networks: spring-docker-network: driver: bridge services: product-db: image: mongo:latest container_name: "product-db" networks: - spring-docker-network ports: - "27017:27017" hostname: product-db environment: MONGO_INITDB_ROOT_USERNAME: admin_username MONGO_INITDB_ROOT_PASSWORD: admin_password MONGO_INITDB_DATABASE: product-db # 挂载初始化脚本到MongoDB默认初始化目录 volumes: - ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js - data:/data/db # 健康检查:确保MongoDB服务完全启动后再允许其他容器连接 healthcheck: test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"] interval: 5s timeout: 5s retries: 5 spring-app: depends_on: # 等待MongoDB健康检查通过后再启动Spring容器 product-db: condition: service_healthy image: spring-app container_name: "spring-app" restart: no ports: - "8080:8080" networks: - spring-docker-network volumes: data: {}
2. 更新Spring Boot的application.yml配置
使用刚创建的专用用户连接,确保参数完全匹配:
spring: data: mongodb: database: product-db host: product-db port: 27017 auto-index-creation: true username: product_user password: product_password authentication-database: product-db # 用户创建在product-db,所以认证库设为该库
3. 重新构建并启动容器
执行以下命令完成部署:
# 停止并清理旧容器 docker compose down # 重新构建Spring应用镜像(若代码有变更) docker build -t spring-app . # 启动容器 docker compose up -d
额外说明
- 去掉认证后能连接是因为MongoDB关闭了权限校验,允许匿名访问,跳过了权限验证环节。
- 默认的
depends_on仅等待容器启动,不等待服务就绪,添加service_healthy条件能避免Spring Boot在MongoDB未完全启动时发起连接请求。 - 挂载初始化脚本时,必须保证本地的
mongo-init.js是文件而非目录,否则会触发“目录已存在”的错误。
内容的提问来源于stack exchange,提问作者Cricket_king
相关产品推荐
相关产品推荐

