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

Docker Compose根目录部署时Flask应用无法连接PostgreSQL实例

问题分析与解决方案

项目结构

project-root/
    back/
        Dockerfile
    docker-compose.yaml
    .env

配置文件内容

docker-compose.yaml

services:
  postgres:
    image: postgres:latest
    restart: always
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}
    ports:
      - ${POSTGRES_PORT}:${POSTGRES_PORT}
    volumes:
      - ./data:/var/lib/posgresql/data      

  flask_app:
    network_mode: "host"
    build:
      context: ./back
      dockerfile: Dockerfile
    ports:
      - ${FLASK_PORT}:${FLASK_PORT}
    environment:
      FLASK_ENV: "development"
    depends_on:
      - postgres
    volumes:
      - ./back:/app

Dockerfile

FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .

RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 5000

ENV FLASK_APP=main.py

CMD if [ "$FLASK_ENV" = "development" ]; then flask --debug run; else flask run; fi

.env

POSTGRES_USER=postgres
POSTGRES_PASSWORD=password
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
FLASK_PORT=5000

报错信息

psycopg2.OperationalError: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: No such file or directory
Is the server running locally and accepting connections on that socket?

问题根源

核心矛盾在于network_mode: "host"配置与POSTGRES_HOST=localhost的冲突:

  • 当Flask容器启用host网络模式时,容器内的localhost指向容器自身,而非PostgreSQL容器或物理主机。
  • 主机上的脚本能正常连接,是因为PostgreSQL容器做了端口映射,主机可通过localhost:5432访问,但Flask容器内的localhost无法定位到PostgreSQL服务。

解决方案

方案一:移除host网络模式(推荐)

Docker Compose默认会创建专属桥接网络,同一网络内的服务可通过服务名称直接访问,无需端口映射也能互通。

  1. 修改docker-compose.yaml,删除flask_app下的network_mode: "host"配置:
services:
  postgres:
    # 保留原有配置不变
    ...

  flask_app:
    build:
      context: ./back
      dockerfile: Dockerfile
    ports:
      - ${FLASK_PORT}:${FLASK_PORT}
    environment:
      FLASK_ENV: "development"
    depends_on:
      - postgres
    volumes:
      - ./back:/app
  1. 修改.env文件,将POSTGRES_HOST改为PostgreSQL服务名postgres:
POSTGRES_USER=postgres
POSTGRES_PASSWORD=password
POSTGRES_HOST=postgres
POSTGRES_PORT=5432
FLASK_PORT=5000
  1. 重启服务生效:
docker-compose down && docker-compose up --build

方案二:保留host网络模式(不推荐)

若必须保留host模式,需让Flask容器通过物理主机的局域网IP访问PostgreSQL:

  1. 查看主机局域网IP(Linux/macOS用ip addr/ifconfig,Windows用ipconfig),比如192.168.3.10。
  2. 修改.env中的POSTGRES_HOST为该IP:
POSTGRES_HOST=192.168.3.10  # 替换为你的主机实际IP
  1. 重启服务即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 14:43:26