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

Docker化Django应用如何确保所有迁移完成后再启动服务与Celery

实现方案

最佳实践是使用Django原生的migrate --check命令做迁移检测,这个命令是Django官方提供的专门用于检测未执行迁移的工具,不会修改任何数据库内容:存在未应用的迁移时返回非0退出码,所有迁移都已应用时返回0,比基于showmigrations输出的grep检测更稳定,不受Django版本、输出本地化格式的影响。

检测迁移的Bash函数

和你现有的check_mariadb风格完全一致,实现非常简洁:

function check_migrations {
  while ! python manage.py migrate --check &> /dev/null; do
    echo "Waiting for all database migrations to be applied"
    sleep 3
  done
  echo "All database migrations are applied"
}

入口点逻辑集成

你可以按照启动模式分支处理逻辑,应用启动时执行迁移,Celery相关进程启动前先等待迁移完成:

# 第一步先检测数据库可用性
check_mariadb

case "$START_MODE" in
  "app")
    # 应用启动分支:主动执行迁移
    python manage.py migrate
    # 替换为你实际的应用启动命令
    exec gunicorn your_project.wsgi:application --bind 0.0.0.0:8000
    ;;
  "celery_worker")
    # Celery Worker启动分支:先等迁移完成再启动
    check_migrations
    # 替换为你实际的Celery Worker启动命令
    exec celery -A your_project worker --loglevel=info
    ;;
  "celery_beat")
    # Celery Beat启动分支:先等迁移完成再启动
    check_migrations
    # 替换为你实际的Celery Beat启动命令
    exec celery -A your_project beat --loglevel=info
    ;;
  *)
    echo "Unknown start mode: $START_MODE"
    exit 1
    ;;
esac

补充说明:Django 1.10及以上版本的migrate命令自带数据库锁,即使多个应用实例同时启动,也不会出现并发执行迁移的问题,不会产生脏数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:03:03