使用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
相关产品推荐
相关产品推荐

