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

Docker中Django项目启动失败:Redis、数据库及Celery连接异常

问题修复方案

核心问题分析

  1. Redis连接失败:Docker Compose中每个容器是独立网络节点,127.0.0.1指向容器自身,而非Redis服务容器,必须用服务名redis作为连接地址。
  2. Django初始化顺序错误:makemigrations应在migrate之前执行,否则新模型无法生成迁移文件;loaddata需在表创建完成后执行,否则会因表不存在报错。
  3. 服务就绪检测缺失:depends_on仅保证启动顺序,不确保PostgreSQL/Redis完全就绪,直接执行migrate会因数据库未初始化失败。
  4. Celery依赖冗余:无需依赖site服务,直接依赖redis和postgres-db即可。

修改后的配置文件

1. Dockerfile

调整初始化命令顺序,确保迁移、数据加载逻辑正确:

FROM python:3.11

WORKDIR /app

COPY . .

RUN pip install -r requirements.txt

# 先生成迁移文件,再执行迁移,最后加载测试数据
CMD python manage.py makemigrations \
    && python manage.py migrate \
    && python manage.py loaddata site_blog/fixtures/posts.json \
    && python manage.py loaddata site_blog/fixtures/post_category.json \
    && python manage.py loaddata site_blog/fixtures/comments.json \
    && python manage.py loaddata users/fixtures/users.json \
    && python manage.py runserver 0.0.0.0:8000

2. docker-compose.yml

修正Redis连接地址,添加服务健康检查,调整依赖逻辑:

version: '3'
services:
  postgres-db:
    image: postgres
    environment:
      POSTGRES_USER: db_mp_blog_username
      POSTGRES_PASSWORD: db_mp_blog_password
      POSTGRES_DB: db_mp_blog
    ports:
      - "5432:5432"
    restart: always
    # 健康检查确保数据库完全就绪
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U db_mp_blog_username -d db_mp_blog"]
      interval: 5s
      timeout: 5s
      retries: 5

  redis:
    image: redis
    restart: always
    ports:
      - "6379:6379"
    # Redis健康检查
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 3s
      timeout: 3s
      retries: 5

  site:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8000:8000"
    depends_on:
      postgres-db:
        condition: service_healthy
      redis:
        condition: service_healthy
    environment:
      DB_NAME: "db_mp_blog"
      DB_USER: "db_mp_blog_username"
      DB_PASSWORD: "db_mp_blog_password"
      DB_HOST: "postgres-db"
      DB_PORT: 5432
      # 修正Redis连接地址为服务名
      CELERY_BROKER_URL: 'redis://redis:6379'
      CELERY_RESULT_BACKEND: 'redis://redis:6379'
      SECRET_KEY: 'django-insecure-c467_p2n3g4ni%yq_ebaqe1j2=!ozmn=zvgh8i23uzos&9p3pc'
    restart: always

  celery:
    build: .
    command: celery -A blog worker --loglevel=info
    depends_on:
      postgres-db:
        condition: service_healthy
      redis:
        condition: service_healthy
    environment:
      DB_NAME: "db_mp_blog"
      DB_USER: "db_mp_blog_username"
      DB_PASSWORD: "db_mp_blog_password"
      DB_HOST: "postgres-db"
      DB_PORT: 5432
      # 修正Redis连接地址
      CELERY_BROKER_URL: 'redis://redis:6379'
      CELERY_RESULT_BACKEND: 'redis://redis:6379'
      SECRET_KEY: 'django-insecure-c467_p2n3g4ni%yq_ebaqe1j2=!ozmn=zvgh8i23uzos&9p3pc'

操作步骤

  1. 将上述修改后的配置文件替换原有文件
  2. 执行docker-compose down停止现有服务
  3. 执行docker-compose up --build重新构建镜像并启动服务

内容的提问来源于stack exchange,提问作者Alexander Emelyanov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 19:45:01