You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 16:20:44