Docker容器内PostgreSQL外部连接方法及服务器端pytest连接失败报错求助
Docker容器内PostgreSQL外部连接方法及服务器端pytest连接失败报错求助
看起来你遇到了Docker容器里PostgreSQL连接的典型问题,本地正常但服务器出错,大概率是监听配置或者连接地址的问题,给你几个快速排查和修复的方向:
先明确你的架构场景
首先得搞清楚:你的PostgreSQL和运行pytest的环境是在同一个Docker容器里,还是两个不同的容器(同属一个docker-compose网络)?这会直接影响连接地址的选择:
场景1:PostgreSQL和pytest在同一个容器里
这种情况下报错"Cannot assign requested address",通常是PostgreSQL没开启IPv6监听,或者只监听了Unix socket,而pytest默认尝试用IPv6连接localhost(也就是::1)。
快速修复步骤:
- 先进入容器:
docker exec -it container_name bash - 找到PostgreSQL的配置文件(一般在
/var/lib/postgresql/data/postgresql.conf),把listen_addresses参数改成'*'(允许监听所有IPv4和IPv6地址) - 同时确认配置里
ipv6 = on(开启IPv6支持) - 重启PostgreSQL服务:
pg_ctl restart -D /var/lib/postgresql/data - 也可以临时应急:把pytest的数据库连接地址从
localhost改成127.0.0.1(强制用IPv4连接,不用改配置就能快速验证问题)
场景2:PostgreSQL和pytest在不同容器里(同docker-compose网络)
这时候绝对不能用localhost作为连接地址!因为容器里的localhost只指向当前容器本身,根本找不到PostgreSQL容器。
快速修复:
- 把pytest的数据库连接字符串里的
localhost,换成docker-compose.yml里PostgreSQL服务的名称(比如你services块里定义的postgres),比如连接串改成:postgresql://username:password@postgres:5432/dbname - 确保两个容器在同一个Docker网络里(docker-compose默认会创建专属网络,只要是同一个compose文件里的服务就没问题)
额外排查点
如果上面的方法没用,再检查这两个地方:
- 查看
pg_hba.conf配置(和postgresql.conf同目录),确保有允许本地连接的规则,比如:host all all 127.0.0.1/32 scram-sha-256 host all all ::1/128 scram-sha-256 - 在容器里手动测试连接:
psql -h localhost -U your_user -d your_db,如果报错就换成psql -h 127.0.0.1 ...,看是不是IPv6的问题,这样能快速定位是Postgres配置还是pytest代码的问题
备注:内容来源于stack exchange,提问作者Prashant kamble
相关产品推荐
相关产品推荐

