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

