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默认会创建专属桥接网络,同一网络内的服务可通过服务名称直接访问,无需端口映射也能互通。
- 修改
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
- 修改
.env文件,将POSTGRES_HOST改为PostgreSQL服务名postgres:
POSTGRES_USER=postgres POSTGRES_PASSWORD=password POSTGRES_HOST=postgres POSTGRES_PORT=5432 FLASK_PORT=5000
- 重启服务生效:
docker-compose down && docker-compose up --build
方案二:保留host网络模式(不推荐)
若必须保留host模式,需让Flask容器通过物理主机的局域网IP访问PostgreSQL:
- 查看主机局域网IP(Linux/macOS用
ip addr/ifconfig,Windows用ipconfig),比如192.168.3.10。 - 修改
.env中的POSTGRES_HOST为该IP:
POSTGRES_HOST=192.168.3.10 # 替换为你的主机实际IP
- 重启服务即可。
内容的提问来源于stack exchange,提问作者user3697344
相关产品推荐
相关产品推荐

