Docker中Python容器连接PostgreSQL容器遇Connection refused错误求助
问题:Docker中Python应用无法连接PostgreSQL容器,提示Connection refused
错误信息
psycopg.OperationalError: connection failed: Connection refused python-1 | Is the server running on host "localhost" (127.0.0.1) and accepting python-1 | TCP/IP connections on port 25432?
已尝试操作
- 使用
condition: service_healthy确保PostgreSQL容器优先启动,无效 - 将数据库主机设为
0.0.0.0或PostgreSQL容器名postgres,未解决问题
相关配置文件
docker-compose.yml
version: "3.8" services: postgres: image: postgres:14.6 ports: - 25432:5432 healthcheck: test: ["CMD-SHELL", "PGPASSWORD=${DB_PASSWORD}", "pg_isready", "-U", "${DB_USERNAME}", "-d", "${DB_NAME}"] interval: 30s timeout: 60s retries: 5 start_period: 80s environment: POSTGRES_USER: ${DB_USERNAME} POSTGRES_PASSWORD: ${DB_PASSWORD} POSTGRES_DB: ${DB_NAME} python: build: context: . dockerfile: Dockerfile depends_on: postgres: condition: service_healthy command: flask --app app init-db && flask --app app run -h 0.0.0.0 -p ${PORT} ports: - ${PORT}:${PORT} environment: DB_HOST: localhost DB_PORT: 25432 DB_NAME: ${DB_NAME} DB_USERNAME: ${DB_USERNAME} DB_PASSWORD: ${DB_PASSWORD}
Dockerfile
# syntax=docker/dockerfile:1 FROM python:3.10 WORKDIR /app COPY requirements.txt requirements.txt RUN pip3 install -r requirements.txt COPY . .
解决方案
1. 修正数据库连接参数
在docker-compose.yml的python服务环境变量中:
- 将
DB_HOST改为容器服务名postgres(Docker Compose默认创建内部网络,服务名可直接作为主机名访问) - 将
DB_PORT改为PostgreSQL容器内部端口5432(而非宿主机映射的25432)
修改后的python服务环境变量段:
environment: DB_HOST: postgres DB_PORT: 5432 DB_NAME: ${DB_NAME} DB_USERNAME: ${DB_USERNAME} DB_PASSWORD: ${DB_PASSWORD}
2. 修复健康检查命令语法
当前健康检查命令存在格式错误,PGPASSWORD需要与pg_isready放在同一命令串内,否则无法正确传递环境变量:
healthcheck: test: ["CMD-SHELL", "PGPASSWORD=${DB_PASSWORD} pg_isready -U ${DB_USERNAME} -d ${DB_NAME}"]
原写法会导致健康检查失败,python服务可能在PostgreSQL未真正就绪时启动。
3. 验证代码中的连接逻辑
确保Python代码正确读取环境变量,示例:
import os import psycopg conn = psycopg.connect( host=os.getenv("DB_HOST"), port=os.getenv("DB_PORT"), dbname=os.getenv("DB_NAME"), user=os.getenv("DB_USERNAME"), password=os.getenv("DB_PASSWORD") )
内容的提问来源于stack exchange,提问作者alramdein
相关产品推荐
相关产品推荐

