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

Docker容器内Python应用无法连接PostgreSQL数据库的求助

解决Docker容器中Python应用连接PostgreSQL的问题

1. 修正PostgreSQL容器的配置错误

你的PostgreSQL Compose配置里设置了POSTGRES_HOST: localhost,这是无效且错误的——Postgres官方并未定义该环境变量,这个设置会强制Postgres仅监听容器内部的127.0.0.1,导致其他容器无法通过网络连接到它。

修改PostgreSQL的Compose配置,移除这个错误的环境变量:

version: "3.7"
services:
  postgresql_database:
    container_name: postgresql_database
    image: postgres:13.8
    environment:
      # 移除 POSTGRES_HOST: localhost
      POSTGRES_PASSWORD: MyPassword
      POSTGRES_USER: MyUsername
      POSTGRES_DB: "MyDatabase"
    volumes:
      - source: ../configs/postgresql
        target: /docker-entrypoint-initdb.d/
        type: bind
    networks:
      - default
      - app_network
    healthcheck:
      test:
        [
          "CMD",
          "pg_isready",
          "-q",
          "-U",
          "MyUsername",
          "-d",
          "MyDatabase"
        ]
      interval: 5s
      timeout: 1s
      retries: 2
    restart: unless-stopped

2. 修正Python应用的连接字符串

两个容器处于同一个app_network网络中,Docker Compose会自动为服务名创建DNS解析,因此需要将连接字符串中的SERVER=localhost替换为PostgreSQL服务的名称postgresql_database。

方式1:更新Compose环境变量

修改Python应用的Compose配置:

version: "3.7"
services:
  flask_app:
    image: https://not_allowed_to_share/flask_app:latest
    container_name: flask_app
    volumes:
      - source: ../configs/flask_app/config.yaml
        target: /config/config.yaml
        type: bind
    environment:
      CONTENT_CONNECTIONSTRING: DRIVER={PostgreSQL Unicode};SERVER=postgresql_database;Port=5432;UID=MyUsername;PWD=MyPassword;Connect Timeout=5;DATABASE=MyDatabase;
      CONTENT_DBTYPE: postgresql_odbc
    networks:
      - app_network
    depends_on:
      postgresql_database:
        condition: service_healthy # 等待数据库健康检查通过再启动
    restart: "no"

方式2:更新config.yaml配置

同步修改../configs/flask_app/config.yaml中的连接字符串:

DRIVER={PostgreSQL Unicode};SERVER=postgresql_database;Port=5432;UID=MyUsername;PWD=MyPassword;Connect Timeout=5;DATABASE=MyDatabase;

3. 确保容器等待数据库就绪

默认的depends_on仅保证PostgreSQL容器先启动,不会等待数据库完全就绪。添加condition: service_healthy后,Python应用容器会等待PostgreSQL的健康检查通过再启动,避免因数据库未初始化完成导致的连接失败。

额外检查:SQLAlchemy连接方式优化

如果你的代码直接使用SQLAlchemy,建议使用psycopg2原生连接格式(比ODBC更稳定):

from sqlalchemy import create_engine

engine = create_engine("postgresql://MyUsername:MyPassword@postgresql_database:5432/MyDatabase")

若必须使用ODBC,需确保Python容器内已安装PostgreSQL ODBC驱动(如psqlodbc包),否则会出现驱动缺失的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 16:37:43