【问题标题】:Why can the spring app not connect to the Postgres db?为什么 spring 应用程序无法连接到 Postgres 数据库?
【发布时间】:2022-01-29 20:18:10
【问题描述】:

我想使用 docker compose 在 docker 容器中使用 Postgres db 构建我的 Spring Boot 应用程序。构建 docker compose 容器时出现错误。 spring 应用程序无法连接到 Postgres 数据库。 Postgres 容器正常运行,我可以创建与通常的 db-client (dbeaver) 的连接。

这是我的配置文件:

1. application.yml

server:
  port: 8081
  error:
    include-message: always
    include-binding-errors: always
spring:
  datasource:
    password: password
    url: jdbc:postgresql://postgres:5432/trainingdb
    username: user
  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        dialect: org.hibernate.dialect.PostgreSQLDialect
        format_sql: true
    show-sql: true

2。 Dockerfile

FROM openjdk:11
ADD target/training-service-1.0.0.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]

3. docker-compose.yml

version: '1'
services:
  app:
    container_name: springboot
    image: springboot
    build: ./
    depends_on:
      - postgres
    ports:
      - "8081:8081"
  postgres:
    image: postgres:latest
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=trainingdb

首先我跑 ./mvnw clean package -DskipTests

构建 jar 文件,然后运行 docker compose up

日志消息的小sn-p:

springboot                   |  at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:51) ~[postgresql-42.2.24.jar!/:42.2.24]
springboot                   |  at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:225) ~[postgresql-42.2.24.jar!/:42.2.24]
springboot                   |  at org.postgresql.Driver.makeConnection(Driver.java:465) ~[postgresql-42.2.24.jar!/:42.2.24]
springboot                   |  at org.postgresql.Driver.connect(Driver.java:264) ~[postgresql-42.2.24.jar!/:42.2.24]
springboot                   |  at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-4.0.3.jar!/:na]
springboot                   |  at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:364) ~[HikariCP-4.0.3.jar!/:na]
springboot                   |  at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-4.0.3.jar!/:na]
springboot                   |  at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:476) ~[HikariCP-4.0.3.jar!/:na]
springboot                   |  at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) ~[HikariCP-4.0.3.jar!/:na]
springboot                   |  at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115) ~[HikariCP-4.0.3.jar!/:na]
springboot                   |  at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) ~[HikariCP-4.0.3.jar!/:na]
springboot                   |  at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) ~[hibernate-core-5.4.32.Final.jar!/:5.4.32.Final]
springboot                   |  at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:180) ~[hibernate-core-5.4.32.Final.jar!/:5.4.32.Final]
springboot                   |  at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:43) ~[hibernate-core-5.4.32.Final.jar!/:5.4.32.Final]
springboot                   |  ... 44 common frames omitted
springboot                   | Caused by: java.net.UnknownHostException: postgresql
springboot                   |  at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:220) ~[na:na]
springboot                   |  at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:na]
springboot                   |  at java.base/java.net.Socket.connect(Socket.java:609) ~[na:na]
springboot                   |  at org.postgresql.core.PGStream.createSocket(PGStream.java:231) ~[postgresql-42.2.24.jar!/:42.2.24]
springboot                   |  at org.postgresql.core.PGStream.<init>(PGStream.java:95) ~[postgresql-42.2.24.jar!/:42.2.24]
springboot                   |  at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:98) ~[postgresql-42.2.24.jar!/:42.2.24]
springboot                   |  at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:213) ~[postgresql-42.2.24.jar!/:42.2.24]
springboot                   |  ... 58 common frames omitted
springboot                   | 
springboot exited with code 1

来自我的 postgres 容器的日志消息:


PostgreSQL Database directory appears to contain a database; Skipping initialization


2022-01-30 07:39:04.321 UTC [1] LOG:  starting PostgreSQL 14.1 (Debian 14.1-1.pgdg110+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit

2022-01-30 07:39:04.321 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432

2022-01-30 07:39:04.321 UTC [1] LOG:  listening on IPv6 address "::", port 5432

2022-01-30 07:39:04.327 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"

2022-01-30 07:39:04.338 UTC [27] LOG:  database system was shut down at 2022-01-30 07:38:38 UTC

2022-01-30 07:39:04.349 UTC [1] LOG:  database system is ready to accept connections

2022-01-30 07:42:16.689 UTC [45] LOG:  invalid length of startup packet

2022-01-30 07:42:16.709 UTC [46] LOG:  invalid length of startup packet

2022-01-30 07:42:16.726 UTC [47] LOG:  invalid length of startup packet

2022-01-30 07:42:39.376 UTC [1] LOG:  received fast shutdown request

2022-01-30 07:42:39.379 UTC [1] LOG:  aborting any active transactions

2022-01-30 07:42:39.381 UTC [1] LOG:  background worker "logical replication launcher" (PID 33) exited with exit code 1

2022-01-30 07:42:39.386 UTC [28] LOG:  shutting down

2022-01-30 07:42:39.430 UTC [1] LOG:  database system is shut down

2022-01-30 07:45:33.835 UTC [1] LOG:  starting PostgreSQL 14.1 (Debian 14.1-1.pgdg110+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit

2022-01-30 07:45:33.835 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432

2022-01-30 07:45:33.836 UTC [1] LOG:  listening on IPv6 address "::", port 5432

2022-01-30 07:45:33.841 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"

2022-01-30 07:45:33.852 UTC [26] LOG:  database system was shut down at 2022-01-30 07:42:39 UTC

2022-01-30 07:45:33.861 UTC [1] LOG:  database system is ready to accept connections

2022-01-30 07:48:44.550 UTC [1] LOG:  received fast shutdown request

2022-01-30 07:48:44.559 UTC [1] LOG:  aborting any active transactions

2022-01-30 07:48:44.564 UTC [1] LOG:  background worker "logical replication launcher" (PID 32) exited with exit code 1

2022-01-30 07:48:44.572 UTC [27] LOG:  shutting down

2022-01-30 07:48:44.630 UTC [1] LOG:  database system is shut down

2022-01-30 07:49:05.986 UTC [1] LOG:  starting PostgreSQL 14.1 (Debian 14.1-1.pgdg110+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit

2022-01-30 07:49:05.986 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432

2022-01-30 07:49:05.988 UTC [1] LOG:  listening on IPv6 address "::", port 5432

2022-01-30 07:49:05.995 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"

2022-01-30 07:49:06.004 UTC [26] LOG:  database system was shut down at 2022-01-30 07:48:44 UTC

2022-01-30 07:49:06.035 UTC [1] LOG:  database system is ready to accept connections


PostgreSQL Database directory appears to contain a database; Skipping initialization



PostgreSQL Database directory appears to contain a database; Skipping initialization

``

 command to start up the containers. Is there any error in my spring boot configuration ?

【问题讨论】:

  • 我认为没有错误。你能分享你的堆栈跟踪吗?
  • 我更新了我的帖子..

标签: spring-boot docker docker-compose dockerfile


【解决方案1】:

我认为问题在于您的 jdbc URL:jdbc:postgresql://postgres:5432/trainingdb

你可以试试这个网址吗:jdbc:postgresql://localhost:5432/trainingdb

【讨论】:

  • 我试了没有成功
【解决方案2】:

您能否查看日志,postgre 容器是否已启动并正在运行?

另外,请使用命令“docker ps”检查容器状态并检查容器名称“postgres”。

【讨论】:

  • 我将 docker compose 文件中的 container_name 设置为 postgres。更改后, docker ps 命令向我显示名为“postgers”的 Postgres db 容器。但这并不能解决我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
  • 2012-04-13
  • 1970-01-01
  • 2017-11-12
  • 2017-02-01
相关资源
最近更新 更多