【问题标题】:Micronaut + PostgreSQL + Docker-compose issueMicronaut + PostgreSQL + Docker-compose 问题
【发布时间】:2021-10-12 05:31:46
【问题描述】:

我正在尝试在 docker-compose 文件上运行使用 PostgreSQL 的 Micronaut 服务。但是我遇到了以下问题:

21:12:32.741 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
21:12:33.744 [main] ERROR 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:315)
at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:51)
at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:225)
at org.postgresql.Driver.makeConnection(Driver.java:465)
at org.postgresql.Driver.connect(Driver.java:264)
at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138)
at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:358)
at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206)
at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:477)
at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:560)
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115)
at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:81)
at io.micronaut.configuration.jdbc.hikari.HikariUrlDataSource.<init>(HikariUrlDataSource.java:35)
at io.micronaut.configuration.jdbc.hikari.DatasourceFactory.dataSource(DatasourceFactory.java:66)
at io.micronaut.configuration.jdbc.hikari.$DatasourceFactory$DataSource0Definition.build(Unknown Source)
at io.micronaut.context.BeanDefinitionDelegate.build(BeanDefinitionDelegate.java:153)
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1979)
at io.micronaut.context.DefaultBeanContext.createAndRegisterSingletonInternal(DefaultBeanContext.java:2768)
at io.micronaut.context.DefaultBeanContext.createAndRegisterSingleton(DefaultBeanContext.java:2754)
at io.micronaut.context.DefaultBeanContext.getBeanForDefinition(DefaultBeanContext.java:2425)
at io.micronaut.context.DefaultBeanContext.getBeanInternal(DefaultBeanContext.java:2399)
at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:1264)
at io.micronaut.context.AbstractBeanDefinition.getBeanForConstructorArgument(AbstractBeanDefinition.java:1014)
at io.micronaut.configuration.hibernate.jpa.$EntityManagerFactoryBean$HibernateStandardServiceRegistry0Definition.doBuild(Unknown Source)
at io.micronaut.context.AbstractParametrizedBeanDefinition.build(AbstractParametrizedBeanDefinition.java:118)
at io.micronaut.context.BeanDefinitionDelegate.build(BeanDefinitionDelegate.java:149)
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1979)
at io.micronaut.context.DefaultBeanContext.createAndRegisterSingletonInternal(DefaultBeanContext.java:2768)
at io.micronaut.context.DefaultBeanContext.createAndRegisterSingleton(DefaultBeanContext.java:2754)
at io.micronaut.context.DefaultBeanContext.getBeanForDefinition(DefaultBeanContext.java:2425)
at io.micronaut.context.DefaultBeanContext.getBeanInternal(DefaultBeanContext.java:2399)
at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:1264)
at io.micronaut.context.AbstractBeanDefinition.getBeanForConstructorArgument(AbstractBeanDefinition.java:1014)
at io.micronaut.configuration.hibernate.jpa.$EntityManagerFactoryBean$HibernateMetadataSources1Definition.doBuild(Unknown Source)
at io.micronaut.context.AbstractParametrizedBeanDefinition.build(AbstractParametrizedBeanDefinition.java:118)
at io.micronaut.context.BeanDefinitionDelegate.build(BeanDefinitionDelegate.java:149)
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1979)
at io.micronaut.context.DefaultBeanContext.createAndRegisterSingletonInternal(DefaultBeanContext.java:2768)
at io.micronaut.context.DefaultBeanContext.createAndRegisterSingleton(DefaultBeanContext.java:2754)
at io.micronaut.context.DefaultBeanContext.loadContextScopeBean(DefaultBeanContext.java:2292)
at io.micronaut.context.DefaultBeanContext.initializeContext(DefaultBeanContext.java:1562)
at io.micronaut.context.DefaultApplicationContext.initializeContext(DefaultApplicationContext.java:234)
at io.micronaut.context.DefaultBeanContext.readAllBeanDefinitionClasses(DefaultBeanContext.java:2905)
at io.micronaut.context.DefaultBeanContext.start(DefaultBeanContext.java:231)
at io.micronaut.context.DefaultApplicationContext.start(DefaultApplicationContext.java:180)
at io.micronaut.runtime.Micronaut.start(Micronaut.java:71)
at org.wcode.author.service.ApplicationKt.main(Application.kt:10)
Caused by: java.net.UnknownHostException: st-database
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:220)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:609)
at org.postgresql.core.PGStream.createSocket(PGStream.java:231)
at org.postgresql.core.PGStream.<init>(PGStream.java:95)
at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:98)
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:213)
... 46 common frames omitted

文件定义

以下是我在当前项目中使用的文件的定义。

docker-compose.yml

version: '3.8'

services:
  st-author-service:
    image: author-service:latest
    environment:
      - JDBC_URL=jdbc:postgresql://st-database:5432/sentency_db
      - JDBC_USER=<USERNAME>
      - JDBC_PASSWORD=<PASSWORD>
      - JDBC_DRIVER=org.postgresql.Driver
    depends_on:
      - st-database
    networks:
      - database-network
      - internal

  st-database:
    image: postgres:13.3-alpine
    restart: always
    env_file:
      - database.env # configure postgres
    volumes:
      - database-data:/var/lib/postgresql/data/
    networks:
      - database-network

volumes:
  database-data:

networks:
  database-network:
    driver: bridge
    external: false
  internal:

application.yml

micronaut:
  application:
    name: authorService
  server:
    port: 7000

datasources:
  default:
    url: ${JDBC_URL:`jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE`}
    username: ${JDBC_USER:sa}
    password: ${JDBC_PASSWORD:""}
    driverClassName: ${JDBC_DRIVER:org.h2.Driver}
    schema-generate: CREATE_DROP

jpa:
  default:
    entity-scan:
      packages: 'org.wcode.author.service.domain.entities'
    properties:
      hibernate:
        hbm2ddl:
          auto: update
        show_sql: true

测试

我测试了指向部署在 Docker 上的 PostgreSQL 数据库的 application.yml 并且它工作正常,当我尝试使用 docker-compose 构建部署时问题就开始了。为了检查网络定义是否正常工作,我将 pgAdmin 与该配置一起部署,并且能够连接到数据库。

在该特定行之后:

Caused by: java.net.UnknownHostException: st-database
 

我得出的结论是,问题是由于找不到主机引起的。

我已经进行了大量研究,但还没有找到解决该问题的方法。我看不到我错过了什么。

提前感谢所有帮助。

更新

我能够从 PostgreSQL 容器中获取连接日志,并且只显示 pgAdmin 连接,服务甚至没有到达要连接的容器。使用的网络是相同的。这是日志:

2021-08-10 15:43:13.465 GMT [100] LOG: connection received: host=sentency-deploy_pgAdmin_1.sentency-deploy_database-network port=40848
2021-08-10 15:43:13.466 GMT [100] LOG: connection authorized: user=user database=postgres
2021-08-10 15:43:13.478 GMT [101] LOG: connection received: host=sentency-deploy_pgAdmin_1.sentency-deploy_database-network port=40850
2021-08-10 15:43:13.479 GMT [101] LOG: connection authorized: user=user database=sentency_db
2021-08-10 15:43:13.491 GMT [102] LOG: connection received: host=sentency-deploy_pgAdmin_1.sentency-deploy_database-network port=40852
2021-08-10 15:43:13.493 GMT [102] LOG: connection authorized: user=user database=postgres
2021-08-10 15:43:17.750 GMT [103] LOG: connection received: host=sentency-deploy_pgAdmin_1.sentency-deploy_database-network port=40858

现在我认为问题可能出在我构建图像的方式上。我目前的 Dockerfile 是:

FROM ghcr.io/graalvm/graalvm-ce:ol7-java11-21.2.0 as build
WORKDIR /author-service
COPY . /author-service
RUN yum install -y -q xz
RUN curl -sL -o - https://github.com/upx/upx/releases/download/v3.96/upx-3.96-amd64_linux.tar.xz | tar xJ
RUN gu install native-image
RUN ./gradlew assemble
RUN native-image --no-fallback --static -jar /author-service/build/libs/author-service-*-all.jar service
RUN ./upx-3.96-amd64_linux/upx -7 /author-service/service

FROM scratch
EXPOSE 7000:7000
COPY --from=build /author-service/service /service
ENTRYPOINT ["./service"]

这给了我一个 27.67MB 的图像。

【问题讨论】:

  • 如果您在services: st-database 下指定container_name: st-database,会有帮助吗?
  • 嗨@JeffScottBrown 我试过了,但错误是一样的。
  • 很抱歉,我忍不住,但错误表明问题可能与 Micronaut 或 Postgres 没有任何关系,而是 Docker 中的网络配置问题。至少这是我的怀疑。祝你好运!
  • 谢谢,@JeffScottBrown。这正是我的想法,但我无法解决它,因为设置在那里并且与 Postgres 的连接正在工作
  • 虽然我和@JeffScottBrown 一起处理这个问题,但我仍然会检查 postgres 日志并查看连接尝试发生了什么,以排除 pg_hba.conf 和/或 postresql.conf 的任何错误配置。 . 也可以看看here 来为你的Caused by: java.net.UnknownHostException: st-database-issue 找到一些灵感。

标签: postgresql docker-compose micronaut


【解决方案1】:

来自 docker compose documentationdepends_on 不等待 [st-database] “准备好”。因此,这可能是由于 Postgres 数据库在您的应用程序尝试接受连接时尚未准备好接受连接造成的。在这种情况下,UnknownHostException 有点奇怪,但这可能取决于 docker 何时绑定端口。要解决此问题,您需要编写一个等待准备就绪的脚本,如 second example here 中所示。

【讨论】:

  • 嗨@eso。我所做的测试是,我只使用以下命令初始化数据库:docker-compose up -d st-database。我检查了日志,直到数据库准备好接受连接并使用docker-compose up -d st-author-service 初始化服务容器。仍然显示相同的错误
  • 那么看来主机真的找不到了。您是否尝试过不使用数据库网络的显式网络设置?我一直在使用将 Postgres 作为容器运行的 Micronaut 服务(尽管不在同一个 docker compose 文件中),所以总的来说它应该可以工作。
  • 当您说没有显式网络时,您的意思是使用默认的 docker-compose 环境? JDBC 将类似于postgresql://bridge:5432/sentency_db?
  • 我刚刚注意到你的st-database没有发布postgres端口5432。这可能是docker没有创建主机地址的原因。
  • 我刚刚添加了``` ports: - "5432:5432" ``` 还是不行,同样的错误与主机有关
猜你喜欢
  • 2019-07-22
  • 2021-11-24
  • 2020-07-11
  • 1970-01-01
  • 2019-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-21
相关资源
最近更新 更多