You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 03:11:18