Python与PostgreSQL Docker容器连接失败问题求助
Docker Compose下Python容器无法连接PostgreSQL的解决方案
核心问题分析
- 容器内
localhost的误解:Python容器中的localhost指向容器自身,而非宿主机或数据库容器,因此无法通过localhost访问PostgreSQL服务。 - 端口映射配置错误:PostgreSQL默认监听容器内的
5432端口,但docker-compose.yml中错误地将宿主机5430端口映射到容器的5430端口,导致端口不匹配。 - 数据库服务地址配置错误:
.env中POSTGRES_SERVER设置为localhost,未使用Docker Compose网络中数据库服务的名称。
具体修复步骤
1. 修正环境变量配置(.env)
将POSTGRES_SERVER的值改为Docker Compose中数据库服务的名称database,这样Python容器可通过服务名直接访问数据库容器:
POSTGRES_USER = "howdyadmin" POSTGRES_PASSWORD = "howdy" POSTGRES_SERVER = "database" # 替换原localhost POSTGRES_DB = "howdydb" POSTGRES_PORT = 5432 # 容器内部PostgreSQL默认端口
2. 修正Docker Compose端口映射(docker-compose.yml)
调整数据库服务的端口映射,将宿主机端口映射到容器内正确的5432端口(此映射仅用于宿主机连接数据库,Python容器无需依赖此映射):
version: '3.8' services: server: container_name: howdyserver restart: always build: context: ./server dockerfile: backend.Dockerfile volumes: - ./server/app/:/app/ env_file: - ./server/.env ports: - 8000:8000 depends_on: - database database: container_name: howdydb image: postgres:15-alpine restart: always volumes: - postgres_data:/var/lib/postgresql/data/ env_file: - ./server/.env ports: - 5430:5432 # 修正为宿主机5430映射到容器5432 volumes: postgres_data:
3. 验证Python代码中的连接字符串
确保代码中使用环境变量构建正确的数据库连接URL,例如:
import os from sqlalchemy import create_engine POSTGRES_USER = os.getenv("POSTGRES_USER") POSTGRES_PASSWORD = os.getenv("POSTGRES_PASSWORD") POSTGRES_SERVER = os.getenv("POSTGRES_SERVER") POSTGRES_PORT = os.getenv("POSTGRES_PORT") POSTGRES_DB = os.getenv("POSTGRES_DB") SQLALCHEMY_DATABASE_URL = f"postgresql://{POSTGRES_USER}:{POSTGRES_PASSWORD}@{POSTGRES_SERVER}:{POSTGRES_PORT}/{POSTGRES_DB}" engine = create_engine(SQLALCHEMY_DATABASE_URL)
验证修复
重新构建并启动容器:
docker-compose down docker-compose up -d --build
查看Python容器日志,确认数据库连接成功。
内容的提问来源于stack exchange,提问作者Petr Holoubek
相关产品推荐
相关产品推荐

