Docker中运行pytest时PostgreSQL主机解析失败及CI连接问题
问题原因分析
本地用db_1作为HOST连接失败的原因
- Docker Compose会为所有服务创建专属内部网络,容器之间可通过服务名/容器名(如
db_1)互相访问,这个主机名解析仅在该内部网络中生效。 - 直接在本地宿主机运行pytest时,宿主机不属于Docker Compose的内部网络,无法识别
db_1这个主机名,因此出现无法解析地址的错误。
本地用localhost成功但GitHub Actions失败的原因
本地成功的本质
你本地用localhost能成功,并非Docker容器里的PostgreSQL在工作——你的docker-compose.yml中db服务的端口配置完全错误:
ports: - "5433:80"
PostgreSQL默认监听端口是5432,而你把容器的80端口(HTTP端口,PostgreSQL不会使用)映射到宿主机5433,这个映射毫无意义。实际你本地pytest连接的是宿主机自身安装的PostgreSQL服务(默认端口5432),和Docker容器无关。
GitHub Actions失败的原因
CI环境的宿主机(GitHub Runner)没有预装PostgreSQL服务,同时你的Docker容器PostgreSQL因为端口映射错误,没有将5432端口暴露到宿主机。此时用localhost:5432连接,既找不到本地PostgreSQL,也无法访问容器里的服务,自然出现连接拒绝。
额外的配置问题
你的SQLALCHEMY_DATABASE_URI格式不符合PostgreSQL规范,正确格式应为:
postgresql://${DB_USER}:${PASSWORD}@${HOST}:${PORT}/${DATABASE}
而非当前的postgresql://${HOST}/${DATABASE}?user=${DB_USER}&password=${PASSWORD}格式。
内容的提问来源于stack exchange,提问作者TechSelfLearner
相关产品推荐
相关产品推荐

