gpt4 book ai didi

postgresql - 如何解决 postgresql 错误 "connection attempt failed"?

转载 作者:行者123 更新时间:2023-11-29 13:11:08 26 4
gpt4 key购买 nike

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

应用.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:连接尝试失败。

谢谢

最佳答案

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

docker ps

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

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

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

你用这个获取ip

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

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

我建议您先测试您的数据库是否准备就绪且可用,然后再将其用于您的网络应用。

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


使用telnet检查数据库状态

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

telnet localhost 3306

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

telnet ok mysql

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

注意:更改 3306 以获得正确的 postgress 端口


使用数据库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

关于postgresql - 如何解决 postgresql 错误 "connection attempt failed"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54616163/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com