【问题标题】:How do I solve postgresql error "connection attempt failed"?如何解决 postgresql 错误“连接尝试失败”?
【发布时间】:2019-07-04 02:20:39
【问题描述】:

我想构建我的 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: {}

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

错误的样子;

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

谢谢

【问题讨论】:

  • “网络”容器是否托管您的 Spring 应用程序?如果是,你能从你的 web 容器内部 ping 到 postgresql 容器吗?
  • 是的,我的应用是 Web 容器。但我无法 ping 到 postgresql 容器。当我在 application.yml 中使用 jdbc:postgresql://localhost:5432/productdb 时,我可以成功构建,但是当我想运行 docker 时,出现以下错误。 org.postgresql.util.PSQLException:连接到 localhost:5432 被拒绝
  • 不需要连接localhost,(localhost=容器本身,想从另一个容器连接时需要连接postgres容器的容器名;
  • lvthillo,是的,我知道。这就是我更改本地主机的原因。现在我使用如上。但是当我想清理安装 mvn 包时,出现错误“org.postgresql.util.PSQLException:连接尝试失败。”

标签: postgresql spring-boot docker


【解决方案1】:

您的数据库应该接受容器外部的连接

sudo docker run --name pg -p 5432:5432 -v pg_data:/var/lib/postgres/data -e POSTGRES_DB=mydb -e POSTGRES_USER=pg_user -e POSTGRES_PASSWORD=pg_password -d postgres -c "listen_addresses=*"

"listen_addresses=" 它将接受容器外的连接*

你可以使用follow credential来连接你的spring boot项目

db_user=pg_user

db_password=pg_password

db_url=jdbc:postgresql://localhost:5432/mydb

【讨论】:

    【解决方案2】:

    在 DigitalOcean 中使用 DataGrip 软件和数据库。出错了

    [08001] The connection attempt failed. java.net.SocketTimeoutException: connect timed out.

    确保我当前的 IP 是 allowed inbound connections 之一并且有效。 (即使错误可能应该有所不同。)

    希望这最终对某人有用。

    【讨论】:

      【解决方案3】:

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

      docker ps
      

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

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

      这些容器在同一个主机上,所以如果你的 web 需要连接到数据库,你必须用 ip 代替:localhost, 127.0.0.1 or 0.0.0.0

      你的猫用这个得到ip

      hostname -I| awk '{printf $1}'
      

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

      我建议您在将数据库用于您的网络应用程序之前测试您的数据库是否已准备就绪且可用。

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


      使用 telnet 检查数据库状态

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

      telnet localhost 3306
      

      如果你的mysql已经准备好了,telnet必须显示如下图的结果:

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

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


      使用 Database IDE 检查数据库状态

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


      不要硬编码参数

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

      所以,修改你的 application.yml

      来自

      datasource:
          url: jdbc:postgresql://db:5432/productdb
      

      datasource:
          url: jdbc:postgresql://${DATABASE_HOST}:5432/productdb
      

      对于开发,在你的eclipse中使用run as configurations >> environment section

      对于制作,您可以:

      • 运行之前的导出变量
      • 将它传递给您的 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
      

      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
      

      【讨论】:

      • JRichardsz,在尝试构建时在 docker 上运行之前出现“尝试失败”错误。
      • 你的意思是当你执行时:mvn clean package?
      • mvn clean package,不启动应用程序。只需编译它。你能附上整个失败日志吗?可能是单元测试错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-27
      • 2016-03-23
      • 2012-09-19
      相关资源
      最近更新 更多