Docker化Flask应用中SQLAlchemy连接PostgreSQL失败求助
Flask容器化后无法连接PostgreSQL数据库的解决方案
问题背景
本地运行正常的Flask应用,容器化部署后出现PostgreSQL连接拒绝错误。
本地数据库配置(config.py)
SQLALCHEMY_DATABASE_URI = 'postgresql://postgres:root@localhost:5432/dataset_creator'
Docker Compose配置
version: '3.7' services: db: container_name: postgresql image: postgres restart: always ports: - "5432:5432" environment: POSTGRES_PASSWORD: root adminer: container_name: adminer image: adminer restart: always ports: - 8080:8080 datasetcreator: container_name: orion-flask-app build: context: ./ ports: - "5000:5000"
错误日志
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not connect to server: Connection refused Is the server running on host "localhost" (127.0.0.1) and accepting TCP/IP connections on port 5432?
解决步骤
1. 修正数据库连接地址
容器内的localhost指向容器自身,而非数据库容器。Docker Compose默认创建的专属网络中,服务名可直接作为域名解析到对应容器,因此需将连接地址中的localhost替换为数据库服务名db:
SQLALCHEMY_DATABASE_URI = 'postgresql://postgres:root@db:5432/dataset_creator'
2. 保证服务启动顺序
PostgreSQL容器启动需要时间完成初始化,可在docker-compose.yml中为Flask服务添加depends_on配置,确保数据库服务先启动:
datasetcreator: container_name: orion-flask-app build: context: ./ ports: - "5000:5000" depends_on: - db
注:
depends_on仅保证启动顺序,不确保数据库服务完全就绪,生产环境需配合健康检查脚本使用。
3. 预创建目标数据库
当前配置未指定初始化数据库,需为db服务添加POSTGRES_DB环境变量,让PostgreSQL容器启动时自动创建dataset_creator数据库:
db: container_name: postgresql image: postgres restart: always ports: - "5432:5432" environment: POSTGRES_PASSWORD: root POSTGRES_DB: dataset_creator
内容的提问来源于stack exchange,提问作者Berkay Çavuşoğlu
相关产品推荐
相关产品推荐

