Docker环境下Django容器无法连接PostgreSQL容器问题求助
问题修复方案
核心问题分析
- 服务依赖缺失:
backend服务未声明依赖postgres,导致Django启动时PostgreSQL可能还未就绪,或无法通过服务名解析到容器。 - PostgreSQL端口配置错误:PostgreSQL容器默认监听端口是
5432,你的docker-compose.yml错误地将主机端口5431映射到容器端口5431,但容器内并未开启该端口。 - 数据库配置端口不匹配:
settings.py中指定的PORT为5431,但容器内PostgreSQL实际运行在5432端口。
修复步骤
1. 修改docker-compose.yml配置
添加postgres服务的健康检查,修正端口映射,并让backend依赖postgres的健康状态:
version: '3.8' services: backend: build: context: . dockerfile: Dockerfile command: python manage.py runserver 0.0.0.0:8000 ports: - 8000:8000 volumes: - .:/app restart: on-failure depends_on: rabbitmq: condition: service_healthy postgres: condition: service_healthy # 添加postgres依赖 postgres: image: postgres container_name: postgres volumes: - ./postgres-data:/var/lib/postgresql/data environment: - POSTGRES_DB=main - POSTGRES_USER=postgres - POSTGRES_PASSWORD=admin ports: - 5431:5432 # 修正端口映射:主机5431 -> 容器默认5432 healthcheck: # 添加健康检查确保服务就绪 test: ["CMD-SHELL", "pg_isready -U postgres -d main"] interval: 10s timeout: 5s retries: 5 rabbitmq: image: rabbitmq:3-management container_name: rabbitmq hostname: rabbitmq ports: - 15673:15672 environment: RABBITMQ_DEFAULT_USER: guest RABBITMQ_DEFAULT_PASS: guest healthcheck: test: rabbitmq-diagnostics check_port_connectivity interval: 30s timeout: 30s retries: 10
2. 修正settings.py数据库配置
将PORT改为容器内PostgreSQL的默认端口5432:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'main', 'USER': 'postgres', 'PASSWORD': 'admin', 'HOST': 'postgres', # 保持服务名,Docker Compose会自动解析 'PORT': '5432' } }
3. 重新启动服务
停止现有容器并重新构建启动:
docker-compose down docker-compose up --build
额外说明
- Docker Compose默认会为所有服务创建同一网络,因此
backend容器可直接通过服务名postgres访问数据库,无需使用localhost; - 健康检查能确保PostgreSQL完全启动后再启动Django,避免因数据库未就绪导致的连接失败。
内容的提问来源于stack exchange,提问作者Usama Hameed
相关产品推荐
相关产品推荐

