Docker中Django项目启动失败:Redis、数据库及Celery连接异常
问题修复方案
核心问题分析
- Redis连接失败:Docker Compose中每个容器是独立网络节点,
127.0.0.1指向容器自身,而非Redis服务容器,必须用服务名redis作为连接地址。 - Django初始化顺序错误:
makemigrations应在migrate之前执行,否则新模型无法生成迁移文件;loaddata需在表创建完成后执行,否则会因表不存在报错。 - 服务就绪检测缺失:
depends_on仅保证启动顺序,不确保PostgreSQL/Redis完全就绪,直接执行migrate会因数据库未初始化失败。 - 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'
操作步骤
- 将上述修改后的配置文件替换原有文件
- 执行
docker-compose down停止现有服务 - 执行
docker-compose up --build重新构建镜像并启动服务
内容的提问来源于stack exchange,提问作者Alexander Emelyanov
相关产品推荐
相关产品推荐

