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

使用docker-compose部署时Python应用无法连接Postgres数据库如何解决

问题根因&解决方案

1. 数据库配置参数不匹配(核心问题)

你当前的代码硬编码参数和docker-compose中postgres的配置完全不一致:

  • compose中POSTGRES_PASSWORD配置为password,代码中DB_PASS为mysecretpassword
  • compose中POSTGRES_DB配置为db_name,代码中DB_NAME为correntista
  • 你加的bind-address=0.0.0.0是MySQL的配置项,Postgres不识别,可以直接删除。

修正方案:
统一两边的配置,推荐代码读取环境变量提高灵活性,修改Python连接部分代码:

from flask import Flask, request, render_template
import psycopg2
import os
import time

app = Flask(__name__)

# 读取环境变量,无则使用默认值
DBHOST = os.getenv("DBHOST", "mypostgres")
DB_NAME = os.getenv("POSTGRES_DB", "correntista")
DB_USER = os.getenv("POSTGRES_USER", "postgres")
DB_PASS = os.getenv("POSTGRES_PASSWORD", "mysecretpassword")
DB_PORT = os.getenv("DB_PORT", 5432)

# 新增连接重试逻辑,解决Postgres初始化慢的问题
retry_times = 5
conn = None
while retry_times > 0:
    try:
        conn = psycopg2.connect(
            dbname=DB_NAME, 
            user=DB_USER, 
            password=DB_PASS, 
            host=DBHOST, 
            port=DB_PORT
        )
        break
    except psycopg2.OperationalError:
        retry_times -= 1
        print(f"数据库连接失败,剩余重试次数:{retry_times},2秒后重试")
        time.sleep(2)

if not conn:
    raise Exception("多次重试后无法连接数据库,服务启动失败")

cur = conn.cursor()

同时修改docker-compose.yml中postgres的环境变量配置:

services:
    mypostgres:
        image: "mypostgres"
        networks:
            - backend
        environment:
            - POSTGRES_PASSWORD=mysecretpassword 
            - POSTGRES_DB=correntista

2. 启动顺序问题

docker-compose的depends_on仅保证容器启动的先后顺序,不会等待Postgres完成初始化(创建数据库、配置用户等操作需要1-3秒),你的Python代码启动时直接发起连接,此时Postgres还未就绪,也会导致连接失败。上面代码中新增的重试逻辑已经解决了这个问题。

3. 网络解析说明

docker-compose默认会对同一网络下的服务名做DNS解析,你直接在代码中填服务名mypostgres作为DBHOST即可,不需要填写带项目前缀的完整容器名banco_mypostgres_1。

验证方法

修改完成后执行以下命令重启服务即可:

docker-compose down && docker-compose up -d

内容的提问来源于stack exchange,提问作者Fperuso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 09:27:04