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

Docker Compose部署后Python无法连接PostgreSQL求助

解决Docker Compose中Python容器无法连接PostgreSQL的问题

你遇到的psycopg2.OperationalError: could not connect to server: Connection refused错误,主要由两个常见问题导致,下面给出具体修复方案:

1. 修正数据库端口配置

在Docker Compose的同一网络内,容器之间通信需要使用容器内部的端口,而非主机映射的端口。你的PostgreSQL容器内部默认端口是5432,主机映射到5433是给外部主机访问用的,Python容器和PostgreSQL容器在同一网络中,应该直接用5432。

修改Python代码中的端口:

# 原代码
port = '5433'
# 修改为
port = '5432'

2. 处理PostgreSQL服务未就绪的问题

depends_on仅保证容器启动顺序,不保证PostgreSQL服务完全初始化完成(Postgres启动需要时间加载数据、初始化服务)。Python容器启动后立即尝试连接,此时Postgres可能还没准备好,导致连接被拒绝。

方案一:在Python脚本中添加连接重试逻辑

通过循环重试连接,直到Postgres就绪:

import pandas as pd
from sqlalchemy import create_engine
import time
from sqlalchemy.exc import OperationalError

username = 'user1'
password = '12345'
host_name = 'pgdatabase'
port = '5432'
database_name = 'traindb'

engine = None
# 最多重试5次,每次间隔3秒
for attempt in range(5):
    try:
        engine = create_engine(f'postgresql://{username}:{password}@{host_name}:{port}/{database_name}')
        # 测试连接是否有效
        with engine.connect():
            print("成功连接到PostgreSQL")
            break
    except OperationalError:
        print(f"连接失败(第{attempt+1}次),等待3秒后重试...")
        time.sleep(3)

if not engine:
    raise RuntimeError("多次尝试后仍无法连接到PostgreSQL")

df = pd.read_csv("iris.csv")
df.to_sql(name='cleandata', con=engine, index=False, if_exists='replace')

方案二:使用wait-for-it脚本等待服务就绪

在Dockerfile中加入等待逻辑,确保Postgres服务完全就绪后再执行Python脚本:

  1. 创建wait-for-it.sh脚本(放到项目根目录):
#!/usr/bin/env bash
HOST="$1"
PORT="$2"
shift 2
CMD="$@"

until nc -z "$HOST" "$PORT"; do
  >&2 echo "$HOST:$PORT 未就绪,等待中..."
  sleep 1
done

>&2 echo "$HOST:$PORT 已就绪"
exec $CMD
  1. 修改项目的Dockerfile:
FROM python:3.9-slim

# 安装依赖和netcat(用于端口检测)
RUN apt-get update && apt-get install -y netcat && \
    pip install --no-cache-dir pandas sqlalchemy psycopg2-binary

# 复制等待脚本和项目文件
COPY wait-for-it.sh /wait-for-it.sh
RUN chmod +x /wait-for-it.sh
COPY . /app
WORKDIR /app

# 等待pgdatabase的5432端口就绪后运行脚本
CMD ["/wait-for-it.sh", "pgdatabase:5432", "--", "python", "你的脚本文件名.py"]

验证修改

完成上述修改后,重新构建并启动容器:

docker-compose down
docker-compose up --build

此时Python容器应该能成功连接到PostgreSQL并写入数据。

内容的提问来源于stack exchange,提问作者Hatice Şeyma Koç

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 23:20:57