我的 Spring Boot 应用程序容器无法连接到我的 postgresql 数据库

SN

我正在尝试对使用 postgresql 的 Spring Boot 应用程序进行 dockerize,所以我在执行cp target/ docker -spring-boot-postgres-0.0.1-SNAPSHOT.jar src/main/ docker之后首先运行./mvnw clean package -DskipTests

这是我的代码

docker-compose.yml

version: '2'

services:
  app:
    image: 'demo:latest'
    build:
      context: .
    container_name: app
    depends_on:
      - db
    environment:
      - SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/postgreTest
      - SPRING_DATASOURCE_USERNAME=postgres
      - SPRING_DATASOURCE_PASSWORD=B123456789
      - SPRING_JPA_HIBERNATE_DDL_AUTO=update

  db:
    image: 'postgres:alpine'
    container_name: db
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=B123456789

文件

FROM adoptopenjdk:11-jre-hotspot
ARG JAR_FILE=*.jar
COPY ${JAR_FILE} application.jar
ENTRYPOINT ["java", "-jar", "application.jar"]

application.props

spring.datasource.url=jdbc:postgresql://db:5432/postgreTest?serverTimezone=UTC
spring.datasource.username=postgres
spring.datasource.password=B123456789
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update

但我不断收到同样的错误

2021-07-16 15:25:31.986 WARN 1 --- [main] ohejeiJdbcEnvironmentInitiator:HHH000342:无法获得查询元数据应用程序的连接| 应用程序| org.postgresql.util.PSQLException: 与 db:5432 的连接被拒绝。检查主机名和端口是否正确以及 postmaster 是否正在接受 TCP/IP 连接。

尼古拉·约夫切夫

多么好的问题啊!乍一看你的配置,我看不出任何明显错误的地方。我相信您可能dbpostgres完全启动之前尝试连接到您的

等待您的 postgres 进程启动(而不仅仅是您的容器)

如果这是问题所在,您很可能会被建议不要使用原始文件depends_on(它只会等到container它本身启动,而是depends_on带有条件和healthcheck.

有了这种方法,你请务必检查是否postgres真正的开始,不只是容器,但数据库本身。即您可以执行以下操作:

// ...
services:
  postgres:
    // ...
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 1s    

  app:
    //... do your springboot app stuff here
    depends_on: 
      postgres:
        condition: service_healthy

编辑:确保下面的数据库确实存在

您在评论中提到,现在您收到另一个错误,说它找不到您的数据库。这很可能是因为在postgres进程本身启动时,您的 jdbc 连接字符串所引用数据库并未创建。

默认情况下,postgres您开箱即用的数据库是:

  • template0
  • template1
  • postgres

另请参阅此链接以获取更多信息。

由于您的jdbc字符串连接/期望连接到另一个数据库: jdbc:postgresql://db:5432/postgreTest,您很可能需要事先创建该数据库。

如何postgreTest预先创建数据库?

嗯,有多种方法:

  • 更多 spring-y/java-y方法:在 spring 上下文中使用原始 jdbc 连接并在其余上下文启动之前创建数据库语句
  • more docker-y:确保您的容器在启动时具有您需要的数据库。这是我将在下面描述如何做的。

postgres-docker 容器支持多种属性,此外还有:

POSTGRES_USER=xyz
POSTGRES_PASSWORD=xxxxx

您还可以使用该属性覆盖创建的默认数据库名称(postgres如果您的用户也是postgresPOSTGRES_DB文档中写道:

此可选环境变量可用于为首次启动映像时创建的默认数据库定义不同的名称。如果没有指定,则该值POSTGRES_USER将被使用

基本上,你会做这样的事情:

  db:
    image: 'postgres:alpine'
    container_name: db
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 1s 
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=B123456789
      - POSTGRES_DB=postgreTest

这将最终创建您的数据库,等待它完全启动(由于健康检查),然后也创建postgresTest数据库,然后才被认为是健康的。然后你的 spring 应用程序将拥有它的所有依赖项,并准备开始。

Docker-compose 规范版本

注意:顺便说一句,我注意到您使用version 2了撰写规范,我会切换到最新的 3,因为 2(和 1)非常笨重,并且通常不允许在新规范版本中很容易实现某些可能性.

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Spring Boot应用程序中找不到我的h2数据库

无法将Spring Boot应用程序与SQL SERVER数据库连接

Intellij找不到我的Spring Boot应用程序

无法使用连接到PostgreSQL数据库的Spring Boot添加和更新值

在Spring-Boot中,我们如何连接到同一项目中的两个数据库(Mysql数据库和MongoDB)?

使用spring-boot连接到spring-batch和应用程序数据库

从数据库加载Spring Boot应用程序属性

获取我的PostgreSQL数据库版本?

如何将数据库连接到我的Android应用程序?

如何将mysql-client连接到我的spring boot应用程序

无法从容器连接到我的Docker主机Postgresql数据库

Spring启动的PostgreSQL-每当我启动应用程序时数据库都是空的

我无法使用“ host.docker.internal:some-port”将我的ASP .NET应用程序从Docker容器连接到我的计算机主机数据库。

Dockerized Spring Boot应用程序连接到数据库Docker映像

从Spring Boot应用程序连接到本地MySQL数据库时出错

将PostgreSQL数据库连接到Spring应用程序(均在docker中运行)连接被拒绝

如何从Java连接到我的Heroku PostgreSQL数据库

Spring Boot不要让我创建没有数据库的存储库

将静态数据库连接到我的 android 应用程序

具有 oracle 数据库重置连接的容器化 Spring Boot 应用程序

spring boot 无法将 spring boot 连接到 postgresql 数据库

如何连接到我的 Heroku postgreSQL 数据库以验证用户身份?

无法从 Spring Boot 应用程序初始化数据库连接

我正在尝试在我的应用程序中使用 oracle 数据库在 heroku 上部署 Spring Boot 应用程序

如何将我的 Spring Boot 应用程序连接到 docker 上的 redis 容器?

为什么每次我的 Spring Boot 应用程序启动时我的 h2 数据库都是空的?

Spring Boot Jpa:我可以将 JSON 文件配置为数据库吗?

当我启动 spring boot 应用程序时,我的数据库没有启动

将 Neo4J 数据库连接到我的 Django 应用程序