Docker Compose构建Maven包时PostgreSQL连接失败排查求助
问题排查:Docker Compose中Spring Boot无法解析PostgreSQL主机(UnknownHostException: postgres)
构建用于Docker Compose的Maven包时出现异常,核心错误为java.net.UnknownHostException: postgres,无法解析postgres主机。本地构建Jar包无报错,但修改配置连接PostgreSQL容器后无法建立连接,相关依赖已提前添加。
异常栈信息
Caused by: jakarta.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution [The connection attempt failed.] [n/a] at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:431) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:400) Caused by: java.net.UnknownHostException: postgres at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:567) at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) at java.base/java.net.Socket.connect(Socket.java:751) at org.postgresql.core.PGStream.createSocket(PGStream.java:260) at org.postgresql.core.PGStream.<init>(PGStream.java:121) at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:140) at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:268)
application.properties配置
spring.application.name=student-app spring.datasource.driver-class-name=org.postgresql.Driver spring.datasource.url=jdbc:postgresql://postgres:5432/student spring.datasource.username=ABCD spring.datasource.password=1234 spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect server.port=8090
docker-compose.yml配置
version: '3.7' services: app: build: . ports: - "8090:8080" depends_on: - postgres networks: - mynetwork postgres: image: postgres:latest environment: POSTGRES_USER: ABCD POSTGRES_PASSWORD: 1234 POSTGRES_DB: student ports: - "5433:5432" networks: - mynetwork networks: mynetwork: driver: bridge
Dockerfile内容
FROM openjdk:25-slim-bullseye ADD target/spring-postgres-docker.jar tmp/spring-postgres-docker.jar ENTRYPOINT [ "java", "-jar" ,"tmp/spring-postgres-docker.jar" ]
已知信息
- 未修改配置时构建Jar包无错误
- 修改为连接PostgreSQL容器配置后无法连接,依赖已提前添加
根因排查与解决方案
1. depends_on未等待PostgreSQL服务就绪
depends_on仅保证postgres容器先于app容器启动,但不确保PostgreSQL服务完成初始化(比如数据库创建、服务监听端口就绪)。当Spring Boot应用启动时,PostgreSQL可能还在初始化流程中,导致连接失败。
解决办法:
- 在Spring Boot中配置数据库连接重试,添加以下配置到application.properties:
spring.datasource.hikari.connection-timeout=20000 spring.datasource.hikari.maximum-pool-size=5 spring.datasource.test-on-borrow=true spring.datasource.validation-query=SELECT 1 - 或者在Dockerfile中集成等待脚本,等待postgres的5432端口开放后再启动应用:
修改Dockerfile:FROM openjdk:25-slim-bullseye ADD target/spring-postgres-docker.jar tmp/spring-postgres-docker.jar ADD https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh /wait-for-it.sh RUN chmod +x /wait-for-it.sh ENTRYPOINT ["/wait-for-it.sh", "postgres:5432", "--", "java", "-jar", "tmp/spring-postgres-docker.jar"]
2. 应用端口映射不匹配
application.properties中配置server.port=8090,但docker-compose里app的端口映射是8090:8080,容器内部应用使用8090端口,映射到宿主机8090端口应该改为8090:8090,否则外部无法访问应用,也会增加调试难度。
解决办法:
修改docker-compose.yml中app的端口配置:
ports: - "8090:8090"
3. 网络配置验证
虽然已指定自定义网络mynetwork,但需确保网络正常创建。执行以下命令检查:
docker network ls
如果mynetwork不存在,重新启动docker-compose:
docker-compose down && docker-compose up --build
内容的提问来源于stack exchange,提问作者VIGNESH REDDY
相关产品推荐
相关产品推荐

