Docker部署Spring Boot访问接口报500且Mongo连接异常如何解决?
问题根因
- 主机名不匹配:Docker Compose 内部网络通过服务名解析容器地址,你配置的Mongo连接地址主机为
mongo,但docker-compose.yml中Mongo服务的名称是mongodb-container,无法正常解析。同时报错日志显示应用实际尝试连接localhost:27017,说明你激活的docker环境配置文件application-docker.properties中的Mongo地址大概率被错误配置为了localhost,覆盖了默认配置。 - 启动时序问题:
depends_on仅控制容器启动顺序,不会等待MongoDB服务完全初始化完成就会启动Java应用,应用启动时Mongo未就绪也会触发连接报错。
修复方案
1. 统一Mongo连接地址与服务名
二选一即可:
- 修改
docker-compose.yml,将Mongo服务名改为mongo,匹配配置中的地址:
version: "3" services: # 把原mongodb-container服务名改为mongo mongo: image: mongo:latest container_name: "mongodb-container" restart: always ports: - 27017:27017 server-container: image: server_side container_name: "server-container" restart: always ports: - 8080:8080 depends_on: - mongo
- 或修改Spring配置文件的Mongo地址,匹配服务名:
如果使用默认application.properties,修改为:
####### Mongo Properties ########### spring.data.mongodb.uri=mongodb://mongodb-container/locationsdb
注意:如果你激活了docker配置文件,必须同步修改application-docker.properties中的Mongo连接地址,避免配置被覆盖。
2. 增加健康检测解决启动时序问题
修改docker-compose.yml,增加Mongo健康检测,确保Mongo服务完全就绪后再启动Java应用:
version: "3" services: mongodb-container: image: mongo:latest container_name: "mongodb-container" restart: always ports: - 27017:27017 # 新增健康检测配置 healthcheck: test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017/test --quiet interval: 5s timeout: 5s retries: 5 server-container: image: server_side container_name: "server-container" restart: always ports: - 8080:8080 depends_on: mongodb-container: # 等待Mongo健康检测通过再启动 condition: service_healthy
3. 重新启动服务
执行以下命令清理旧容器并重启:
docker-compose down -v docker-compose up --build
内容的提问来源于stack exchange,提问作者Kent
相关产品推荐
相关产品推荐

