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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 14:47:34