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

