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

Docker容器化Django项目连接PostgreSQL失败求助

问题分析

错误提示显示Django尝试连接本地Unix socket /var/run/postgresql/.s.PGSQL.5432,但PostgreSQL运行在独立容器中,说明Django未正确获取数据库主机配置,默认使用了本地连接方式,而非通过TCP连接到PostgreSQL容器。

解决方案

1. 为Django容器加载环境变量文件

你的docker-compose.yml中task服务未配置env_file,导致Django容器无法读取.env文件内的POSTGRES_HOST等数据库配置,从而默认使用本地连接。修改docker-compose.yml的task服务部分:

services:
  task:
    build: .
    volumes:
      - .:/test_task
    ports:
      - 8000:8000
    image: app:django
    container_name: test_task_container
    command: python manage.py runserver 0.0.0.0:8000
    env_file:
      - .env
    depends_on:
      - db_task

  db_task:
    image: postgres:14.1-alpine
    restart: always
    env_file:
      - .env
    ports:
      - '5432:5432'
    volumes:
      - db:/var/lib/postgresql/data
volumes:
  db:
    driver: local

2. 验证环境变量加载情况

进入Django容器检查环境变量是否正确加载:

docker exec -it test_task_container printenv POSTGRES_HOST

若输出db,则说明环境变量加载成功。

3. (可选)确保PostgreSQL就绪后启动Django

depends_on仅保证启动顺序,不等待PostgreSQL完全就绪。如需确保数据库服务可用后再启动Django,可使用wait-for-it脚本:

  • 在项目根目录添加wait-for-it.sh脚本
  • 修改Dockerfile安装依赖工具:
FROM python:3.10-slim-buster

ENV PYTHONBUFFERED=1

WORKDIR /test_task

COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
RUN apt-get update && apt-get install -y netcat-traditional
COPY wait-for-it.sh .
RUN chmod +x wait-for-it.sh
  • 修改docker-compose的command:
command: ./wait-for-it.sh db_task:5432 -- python manage.py runserver 0.0.0.0:8000
验证修复

重新构建并启动容器:

docker compose down
docker compose build
docker compose up

此时Django将通过TCP连接到db_task容器的PostgreSQL服务,不再出现socket找不到的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 20:14:55