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

