Docker Compose部署Spring Boot无法连接PostgreSQL问题
问题修复方案
你的配置存在3处核心错误,按如下方式修改即可正常启动:
- 错误1:
docker-compose.yml中PostgreSQL服务的环境变量格式不符合YAML语法,导致容器无法读取POSTGRES_PASSWORD等配置,直接启动失败。
你当前的环境变量写法- POSTGRES_USER:postgres中,冒号和值之间没有空格,YAML解析器不会将其识别为有效的键值对;列表形式传环境变量建议统一用=连接键和值,避免空格导致的解析问题。
将persons-db-service下的environment配置替换为如下内容:environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=123456 - POSTGRES_DB=persons-db - 错误2:Java应用实际使用的数据库连接地址和配置不一致,抛出主机找不到异常。从错误日志可以看到应用尝试连接的主机名是
persons-db,但你贴出的application.properties里填写的主机名是persons-db-service,说明你修改配置后没有重新打包Jar文件,Docker镜像里打包的还是旧版本的配置文件,Docker内置网络中不存在persons-db这个主机名,所以连接失败。
修复方式:先执行构建命令(Maven项目执行mvn clean package,Gradle项目执行对应打包命令)将最新的配置文件打入Jar包,再重新执行docker-compose build构建镜像即可。 - 错误3:现有
depends_on配置只能控制容器启动顺序,不会等待PostgreSQL服务完全初始化完成。PostgreSQL容器启动后需要数秒时间完成初始化、开启端口监听,此时Java应用如果直接发起连接会被拒绝。
修复方式:在application.properties中添加连接池重试配置,让应用在数据库未就绪时自动重试连接:spring.datasource.hikari.connection-timeout=20000 spring.datasource.hikari.initialization-fail-timeout=40000 spring.datasource.hikari.validation-timeout=5000
全部修改完成后,执行docker-compose up --build命令重新构建并启动服务即可正常运行。
内容的提问来源于stack exchange,提问作者Abdul Samad
相关产品推荐
相关产品推荐

