【问题标题】:Docker-compose does not recognice Postgres Host of SpringBoot AppDocker-compose 无法识别 Spring Boot App 的 Postgres 主机
【发布时间】:2020-10-12 10:18:51
【问题描述】:

我正在尝试将 docker-compose 与 springboot 应用程序(使用 JPA)和 postgres 数据库一起使用,我对使用 docker 有点陌生,但我不知道自己做错了什么。

问题

当我构建 springboot 应用程序时,如果我改变 spring.datasource.url=jdbc:postgresql://localhost:5432/postgres(有效的代码) 将其托管在 postgres 容器中,spring.datasource.url=jdbc:postgresql://postgres:5432/postgres

它抛出了一个由以下原因引起的 PSQLException:java.net.UnknownHostException: postgres.(下面有更多详细信息)

application.properties

server.port = 8080

## default connection pool
spring.datasource.hikari.connectionTimeout=20000
spring.datasource.hikari.maximumPoolSize=5

## PostgreSQL
spring.datasource.url=jdbc:postgresql://postgres:5432/postgres
spring.datasource.username=postgres
spring.datasource.password=postgres

spring.jpa.hibernate.ddl-auto=create

例外

2020-06-22 19:07:10.597  INFO 16088 --- [           main] c.a.a.AnnotationToolApplicationTests     : Starting AnnotationToolApplicationTests on DESKTOP-P1E07PA with PID 16088 (started by Pedro in C:\Users\Pedro\git\tfg\annotation-tool\annotation-tool)
2020-06-22 19:07:10.598  INFO 16088 --- [           main] c.a.a.AnnotationToolApplicationTests     : No active profile set, falling back to default profiles: default
2020-06-22 19:07:11.584  INFO 16088 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2020-06-22 19:07:11.719  INFO 16088 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 120ms. Found 3 JPA repository interfaces.
2020-06-22 19:07:12.235  INFO 16088 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-06-22 19:07:12.572  INFO 16088 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
2020-06-22 19:07:12.746  INFO 16088 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate Core {5.4.10.Final}
2020-06-22 19:07:13.002  INFO 16088 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.1.0.Final}
2020-06-22 19:07:13.434  INFO 16088 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2020-06-22 19:07:16.873 ERROR 16088 --- [           main] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Exception during pool initialization.
org.postgresql.util.PSQLException: The connection attempt failed.
        at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:292) ~[postgresql-42.2.9.jar:42.2.9]
...
 at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:126) ~[surefire-booter-2.22.2.jar:2.22.2]
        at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:418) ~[surefire-booter-2.22.2.jar:2.22.2]
Caused by: java.net.UnknownHostException: postgres
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184) ~[na:1.8.0_222]

docker-compose.yml

version: '3'
services: 
    # SpringBoot App
    postgres:
        image: "postgres:9.6-alpine"  
        ports: 
          - 5432:5432
        volumes: 
          - apiDB:/var/lib/postgresql/data

        environment:
          - POSTGRES_DB=postgres
          - POSTGRES_USER=postgres
          - POSTGRES_PASSWORD=postgres


    api:
      build: ./annotation-tool
      ports: 
        - 8080:8080
      depends_on:
        - postgres


    client:
      container_name: client-container
      build: ./client
      ports: 
        - 8081:8081


  
volumes: 
    apiDB:

API Dockerfile

FROM maven:3.6.1-jdk-8-slim AS build
RUN mkdir -p /workspace
WORKDIR /workspace
COPY pom.xml /workspace
COPY src /workspace/src
RUN mvn -f pom.xml clean package

FROM openjdk:8
COPY --from=build /workspace/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]

我认为发生过/尝试过的事情

也许 DNS 不工作,但我不知道如何解决它

我尝试了不同的 docker-compose 和 Dockerfiles,但它不起作用

如果我运行 docker-compose,postgres 容器就会成功创建

我尝试将 url 主机更改为 postgres-backend,因为我的容器就是这样命名的

我尝试使用组件之间的链接。

【问题讨论】:

  • 您的容器名为postgres-backend,您可以尝试更改网址以包含它吗?
  • 它不起作用spring.datasource.url=jdbc:postgresql://postgres-backend:5432/postgres,同样的错误
  • 我建议删除所有links:container_name: 选项;它们可能不会产生影响,但可能会使事情变得混乱,而且它们不是必需的。您在应用程序执行的哪个阶段尝试连接到数据库? (您是否在响应 HTTP 请求时收到此异常?您是否尝试在 Dockerfile 中运行迁移?)
  • 在 Dockerfile 中运行的东西无法连接到数据库或其他 Compose 管理的资源。 (它们不在 Compose 网络上,它们看不到环境变量或网络设置,并且无法保证构建顺序。)
  • 构建不应依赖于数据库。 (“这是一个 jar 文件,但它并不是很有用,因为外部数据库只在我的机器上。”)我不确定您具体要构建什么,但在启动时进行与数据库相关的设置比在构建时间。

标签: postgresql spring-boot docker docker-compose


【解决方案1】:

我认为 springboot 应用程序在其容器启动之前找到 postgres db...您可以在 springboot 容器中添加 depends_on 属性..所以 postgres 容器首先启动然后 springboot

version: '3'
services: 
    # SpringBoot App
    postgres:
        image: "postgres:9.6-alpine"  
        ports: 
          - 5432:5432
        volumes: 
          - apiDB:/var/lib/postgresql/data

        environment:
          - POSTGRES_DB=postgres
          - POSTGRES_USER=postgres
          - POSTGRES_PASSWORD=postgres


    api:
      build: ./annotation-tool
      ports: 
        - 8080:8080
      depends_on:
        - postgres


    client:
      container_name: client-container
      build: ./client
      ports: 
        - 8081:8081


  
volumes: 
    apiDB:

【讨论】:

  • 它不起作用,我认为问题是在编译 maven 以创建 .jar 时无法识别主机。还是谢谢你
【解决方案2】:

我不知道我是否正在考虑简单的正确知道,但是您的 docker-compose 文件的所有容器都在同一主机上运行,​​对吗?那么你的网址应该指向jdbc:postgresql://localhost:5432/postgres

【讨论】:

  • 不行,异常提示主机或端口错误
【解决方案3】:

我不知道您是否已经解决了问题,但您是否尝试过在设置中使用桥接网络?

version: '3'
services: 
    # SpringBoot App
    postgres:
     image: "postgres:9.6-alpine"  
     ports: 
       - 5432:5432
     volumes: 
       - apiDB:/var/lib/postgresql/data

     environment:
       - POSTGRES_DB=postgres
       - POSTGRES_USER=postgres
       - POSTGRES_PASSWORD=postgres
     networks:
       - database-network


    api:
      build: ./annotation-tool
      ports: 
        - 8080:8080
      depends_on:
        - postgres
      networks:
        - database-network


    client:
      container_name: client-container
      build: ./client
      ports: 
        - 8081:8081

networks:
  database-network:
    driver: bridge
    external: false
  
volumes: 
    apiDB:

【讨论】:

  • 它对我不起作用
猜你喜欢
  • 2020-11-08
  • 2021-04-16
  • 2020-04-23
  • 1970-01-01
  • 2016-10-25
  • 1970-01-01
  • 2020-07-12
  • 2019-04-19
相关资源
最近更新 更多