如何解决 postgresql 错误“连接尝试失败”?

Ibr*_*tes 6 postgresql docker spring-boot

我想构建我的 springboot 项目。然后我想dockerize我的代码。但是当我构建时,我得到了错误。我认为这是由 postgresql 设置引起的。但我找不到原因。

请你帮助我好吗?

docker-compose.yml file;

version: '2'
services:
  web:
    build: .
    ports:
      - 8080:8080
  db:
    container_name: productdb
    image: postgres:9.5
    volumes:
    - sample_db:/var/lib/postgresql/data
    environment:
    - POSTGRES_PASSWORD=bright
    - POSTGRES_USER=postgres
    - POSTGRES_DB=productdb
    - PGDATA=/var/lib/postgresql/data/pgdata
    ports:
    - "5432:5432"

volumes:
  productdb: {}
Run Code Online (Sandbox Code Playgroud)

application.yml 文件;

server:
  port: 8761
eureka:
  client:
  registerWithEureka: false
  fetchRegistry: false
  server:
  enableSelfPreservation: false
  waitTimeInMsWhenSyncEmpty: 0

spring:
  application:
    name: product-service
  datasource:
    url: jdbc:postgresql://db:5432/productdb
    username: postgres
    password: xxxx
    initialization-mode: always
  jpa:
    show-sql: true
    hibernate:
      ddl-auto:
    properties:
      hibernate:
        temp:
          use_jdbc_metadata_defaults: false
Run Code Online (Sandbox Code Playgroud)

错误看起来像;

org.postgresql.util.PSQLException:连接尝试失败。

谢谢

JRi*_*dsz 5

如果你的 docker-compose.yml 文件配置良好,它应该启动两个容器:

docker ps
Run Code Online (Sandbox Code Playgroud)

码头工人 来源:https ://intelligentbee.com/2017/09/18/setup-docker-symfony-project/

一种用于应用程序,一种用于数据库。

这些容器位于同一主机中,因此如果您的 Web 需要连接到数据库,则必须改为 ip:localhost、127.0.0.1 或 0.0.0.0

你用这个获取ip

hostname -I| awk '{printf $1}'
Run Code Online (Sandbox Code Playgroud)

如果您的网站和数据库位于不同的主机上,您可以使用托管数据库的公共 IP。但当您使用docker-compose时,情况并非如此。

我建议您在网络应用程序中使用数据库之前先测试一下数据库是否已准备就绪且可用。

为了测试您的数据库,您可以遵循以下方法之一:


使用 telnet 检查数据库状态

有多种方法,但最简单的选择是telnet命令。例如,为了测试 mysql 容器是否可以在启动的同一台机器上使用:

telnet localhost 3306
Run Code Online (Sandbox Code Playgroud)

如果你的mysql已经准备好了,telnet一定会显示如下图所示的结果:

远程登录 ok mysql

任何其他负面结果,都表明您的 mysql 容器已退出或错误。

注意:将 3306 更改为正确的 postgress 端口


使用数据库 IDE 检查数据库状态

UI 用户的其他选择是使用某些数据库 IDE 测试数据库连接。只需下载几个 postgress 客户端 IDE 之一并测试您的数据库即可。


不要硬编码参数

使用环境变量外部化配置是一个很好的做法。Spring 和 docker知道并允许我们使用它们。

因此,修改您的application.yml

datasource:
    url: jdbc:postgresql://db:5432/productdb
Run Code Online (Sandbox Code Playgroud)

datasource:
    url: jdbc:postgresql://${DATABASE_HOST}:5432/productdb
Run Code Online (Sandbox Code Playgroud)

对于开发,在您的 Eclipse 中使用“作为配置运行>>环境”部分

对于生产,您可以:

  • 运行前导出变量
  • 将它传递给你的 docker run 语句...
docker run -d \
--name my_funny_api \
-p 8080:8080 \
-e "DATABASE_HOST=10.10.01.52" \
-i -t my_funny_api_image
Run Code Online (Sandbox Code Playgroud)

或者

export HOST_IP=$(hostname -I| awk '{printf $1}')

docker run -d \
--name my_funny_api \
-p 8080:8080 \
-e "DATABASE_HOST=${DATABASE_HOST}" \
-i -t my_funny_api_image
Run Code Online (Sandbox Code Playgroud)