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

Docker环境下Django容器无法连接PostgreSQL容器问题求助

问题修复方案

核心问题分析

  1. 服务依赖缺失:backend服务未声明依赖postgres,导致Django启动时PostgreSQL可能还未就绪,或无法通过服务名解析到容器。
  2. PostgreSQL端口配置错误:PostgreSQL容器默认监听端口是5432,你的docker-compose.yml错误地将主机端口5431映射到容器端口5431,但容器内并未开启该端口。
  3. 数据库配置端口不匹配: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 08:40:50