我正在阅读相关内容并尝试自己解决它:
使用 docker 在 NodeJS 上的 Postgres 的 ECONNREFUSED
由于不支持身份验证类型 10,无法连接到 Postgres 数据库
我做了很多步骤,但没有实现从 python 脚本到 Postgres Docker 的连接:
我的docker-compose.yml
version: "3.8"
services:
postgres:
image: postgres:14
restart: always
ports:
- "5432:5432"
environment:
- POSTGRES_USER=root
- POSTGRES_PASSWORD=root
- POSTGRES_DB=project1
pgadmin:
image: dpage/pgadmin4
environment:
- [email protected]
- PGADMIN_DEFAULT_PASSWORD=adminadmin
ports:
- "5050:80"
restart: always
depends_on:
- postgres
然后我就跑
docker-compose up
我的脚本.py:
import psycopg2
conn = psycopg2.connect(
host="host.docker.internal",
database="project1",
user="root",
password="root",
port=5432
)
print(conn)
# create a cursor
cur = conn.cursor()
# execute a statement
print('PostgreSQL database version:')
result = cur.execute('SELECT version()')
print(result)
当我尝试连接到数据库时,如果我更改主机,控制台会触发多个错误:
host.docker.internal(我想我必须在 postgresql.conf 或 pg_hba.conf 中做一些事情,但我不确定):
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: connection to server at "host.docker.internal" (192.168.1.145), port 5432 failed: FATAL: no pg_hba.conf entry for host "192.168.1.145", user "root", database "project1", SSL off
本地主机
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: connection to server at "localhost" (::1), port 5432 failed: FATAL: password authentication failed for user "root"
0.0.0.0
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: connection to server at "0.0.0.0", port 5432 failed: Cannot assign requested address (0x00002741/10049)
Is the server running on that host and accepting TCP/IP connections?
顺便说一句:Docker 正确运行服务,我可以毫无问题地连接到 PGAdmin。
有什么想法吗?
这是 docker 将由 localhost 作为主机访问,而不是
host.docker.internal
conn = psycopg2.connect(
host="localhost",
database="project1",
user="root",
password="root",
port=5432
)
将来,当您尝试在同一个 docker-compose 文件中为脚本托管容器时,主机将是
postgres
conn = psycopg2.connect(
host="postgres",
database="project1",
user="root",
password="root",
port=5432
)
就我而言,经过大量搜索,没有找到解决方案。我自己发现了这个问题。 那将是使用同一端口的另一个程序。这就是它造成冲突的原因。 也许是你的问题。 如果您在 Windows 上安装它,请运行以下命令“CMD ADMINISTRATOR”。 列出正在使用端口 5432 的进程。
netstat -ano | findstr :5432
该命令结果的最后一个值是进程ID。
现在完成所有流程。然后再次启动容器。它会起作用的。
taskkill /F /PID idprocess