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

Docker部署Django无法连接PostgreSQL数据库问题求助

解决Django容器无法连接PostgreSQL容器的问题

核心问题定位

你的配置里存在一个关键错误:容器间通信误用了主机映射端口,而非PostgreSQL容器的内部端口。

具体修复步骤

1. 修正Django数据库配置(Settings.py)

将数据库端口从5332改为5432——PostgreSQL容器内部默认监听5432端口,容器间通信直接使用内部端口;5332只是主机到容器的映射端口,仅用于外部主机访问数据库:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.environ.get('POSTGRES_DB'),
        'USER': os.environ.get('POSTGRES_USER'),
        'PASSWORD': os.environ.get('POSTGRES_PASSWORD'),
        'HOST': 'db',
        'PORT': 5432,  # 此处改为容器内部端口5432
    }
}

2. 增强PostgreSQL容器的健康检查(docker-compose.yaml)

仅用wait-for-it检测端口开放不够,PostgreSQL启动后还需要时间完成初始化。添加健康检查,确保数据库完全就绪后Django再执行迁移:

services:
  db:
    image: postgres
    restart: always 
    volumes:
      - ./data/db:/var/lib/postgresql/data
    ports:
      - '5332:5432'
    environment:
      - POSTGRES_DB=(db name here)
      - POSTGRES_USER=(db user here)
      - POSTGRES_PASSWORD=(db password here)
    healthcheck:  # 添加健康检查规则
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
      interval: 5s
      timeout: 5s
      retries: 5

  django-apache2:
    # 其他配置保持不变
    depends_on:
      db:
        condition: service_healthy  # 仅在db容器健康就绪后启动

3. 确认环境变量占位符已替换

确保docker-compose.yaml中的POSTGRES_DB、POSTGRES_USER、POSTGRES_PASSWORD已替换为实际的数据库名称、用户名和密码,不要保留(db name here)这类占位符。

4. 可选:清理Dockerfile冗余配置

你的Django容器不需要暴露5432端口,可从Dockerfile中删除EXPOSE 80 5432,改为EXPOSE 80 443。

验证修复

执行以下命令重新构建并启动容器:

docker compose down
docker compose up --build

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 21:02:10