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
相关产品推荐
相关产品推荐

