如何解决 postgresql 错误“连接尝试失败”?
Posted
技术标签:
【中文标题】如何解决 postgresql 错误“连接尝试失败”?【英文标题】:How do I solve postgresql error "connection attempt failed"? 【发布时间】: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:连接尝试失败。” 【参考方案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
最后为了避免手动任务来管理你的变量,你可以使用:http://github.com/jrichardsz/tachikoma-ops
【讨论】:
JRichardsz,在尝试构建时在 docker 上运行之前出现“尝试失败”错误。 你的意思是当你执行时:mvn clean package? mvn clean package,不启动应用程序。只需编译它。你能附上整个失败日志吗?可能是单元测试错误。以上是关于如何解决 postgresql 错误“连接尝试失败”?的主要内容,如果未能解决你的问题,请参考以下文章
org.postgresql.util.PSQLException:连接尝试失败
Docker Compose 无法从数据库 (jdbc:postgresql://db:5432/postgres) 为用户“postgres”获取连接:连接尝试失败
错误信息:由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败,怎么解决啊!