Dockerized Spring Boot + Postgres连接被拒绝

时间:2020-09-14 07:48:22

标签: postgresql spring-boot docker docker-compose database-connection

尝试启动一个使用docker-compose连接到两个PostgreSQL数据库的Spring Boot应用程序,当Spring尝试连接到这些数据库中的任何一个时,我都被拒绝了连接。

我的配置如下:

docker-compose.yml

version: '3.2'
services:
  mydb-1:
    container_name: mydb-1
    image: mydb-1
    ports:
      - '5432:5432'
    environment:
         - POSTGRES_PASSWORD=postgres
         - POSTGRES_USER=postgres
         - POSTGRES_DB=testdb1
  mydb-2:
    container_name: mydb-2
    image: mydb-2
    ports:
      - '5433:5432'
    environment:
          - POSTGRES_PASSWORD=postgres
          - POSTGRES_USER=postgres
          - POSTGRES_DB=testdb2
  my-server:
    image: my-server-spring
    restart: on-failure
    depends_on:
      - mydb-1
      - mydb-2
    environment:
      - SPRING_DB1-DATASOURCE_JDBC-URL=jdbc:postgresql://mydb-1:5432/testdb1
      - SPRING_DB2-DATASOURCE_JDBC-URL=jdbc:postgresql://mydb-2:5433/testdb2
    expose:
      - '8080'
    ports:
      - '8080:8080'

Spring application.properties

spring.db1-datasource.jdbc-url= jdbc:postgresql://localhost:5432/testdb1
spring.db1-datasource.username= postgres
spring.db1-datasource.password= postgres
spring.db1-datasource.driverClassName= org.postgresql.Driver

spring.db2-datasource.jdbc-url= jdbc:postgresql://localhost:5433/testdb2
spring.db2-datasource.username= postgres
spring.db2-datasource.password= postgres
spring.db2-datasource.driverClassName= org.postgresql.Driver

Stacktrace (一部分)

org.postgresql.util.PSQLException: Connection to testdb2:5433 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.

advidi-server_1         |       at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:285) ~[postgresql-42.2.14.jar!/:42.2.14]
advidi-server_1         |       at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49) ~[postgresql-42.2.14.jar!/:42.2.14]
advidi-server_1         |       at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:217) ~[postgresql-42.2.14.jar!/:42.2.14]
advidi-server_1         |       at org.postgresql.Driver.makeConnection(Driver.java:458) ~[postgresql-42.2.14.jar!/:42.2.14]
advidi-server_1         |       at org.postgresql.Driver.connect(Driver.java:260) ~[postgresql-42.2.14.jar!/:42.2.14]
advidi-server_1         |       at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-3.4.5.jar!/:na]
advidi-server_1         |       at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:358) ~[HikariCP-3.4.5.jar!/:na]
advidi-server_1         |       at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-3.4.5.jar!/:na]
advidi-server_1         |       at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:477) ~[HikariCP-3.4.5.jar!/:na]
advidi-server_1         |       at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:560) ~[HikariCP-3.4.5.jar!/:na]
advidi-server_1         |       at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115) ~[HikariCP-3.4.5.jar!/:na]
advidi-server_1         |       at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) ~[HikariCP-3.4.5.jar!/:na]
advidi-server_1         |       at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) ~[hibernate-core-5.4.18.Final.jar!/:5.4.18.Final]
advidi-server_1         |       at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:180) ~[hibernate-core-5.4.18.Final.jar!/:5.4.18.Final]

最初,我认为问题在于Spring应用程序试图在引导完成之前连接到数据库,但事实并非如此,因为使用restart: on-failure它应该在某个时候进行管理连接。

默认localhost值也不应该成为问题,因为这些值已由docker-compose文件中的环境变量替换。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您没有显示mydb-1mydb-2的图像配置,因此我实际上是在猜测。

  1. 无需将端口映射到主机。删除ports:条目。
  2. 弹簧容器应使用端口5432才能连接到两个DB容器。每个数据库容器都有自己的IP,因此没有问题。不要连接到localhost,因为那是容器本身。
  3. 因为这是默认设置,所以无需在连接字符串中指定:5432
  4. 似乎您在服务器配置的application.propertiesenvironment:条目中都具有连接设置。该应用程序使用哪个?无论如何,您的连接字符串应以mydb-1/testdb1mydb-2/testdb2结尾-没什么比这更复杂的了。

答案 1 :(得分:0)

您正在环境中传递SPRING_DB1-DATASOURCE_JDBC-URL,而不是在application.properties中使用它。因此变量不会被覆盖。

您需要在application.properties中使用类似的内容
spring.db1-datasource.jdbc-url=$SPRING_DB1-DATASOURCE_JDBC-URL

在环境中设置应用程序中变量的确切名称。属性
- spring.db1-datasource.jdbc-url=jdbc:postgresql://mydb-1:5432/testdb1

我建议第二个选项,它仍然允许您将application.properties用作在本地运行的默认值。