Docker/Django - Как убедиться, что все миграции завершены до запуска приложения?

В моем докеризованном Django-приложении у меня есть следующая bash-функция в моем docker-entrypoint.sh. В основном она проверяет, доступна ли база данных:

function check_mariadb {
  while ! mysqladmin --user=$MYSQL_USER --password=$MYSQL_PASSWORD --host $MYSQL_HOST ping --silent &> /dev/null; do
    echo "Waiting for MariaDB service to become available"
    sleep 3
    done
    echo "MariaDB is up and available"
}

Поскольку мое приложение может запускаться в 3 режимах (как приложение, Celery_worker или Celery_beat), мне каким-то образом нужно убедиться, что все миграции выполнены до запуска celery. В противном случае я сталкиваюсь с проблемой, что в Celery отсутствует одна из этих таблиц:

django_celery_results_chordcounter
django_celery_results_groupresult
django_celery_results_taskresult

Может ли кто-нибудь подсказать мне, что может быть лучшей практикой для проверки открытой миграции в этом контексте? И позволять celery запускаться только если все миграции завершены?!... Было бы здорово, если бы это также можно было обработать в простой функции bash, как в приведенной выше.

Заранее спасибо.

В вашем docker-compose.yaml вы можете добавить проверку здоровья для контейнера Django:

healthcheck:
  test: ["CMD", "curl --fail http://localhost:8000/ || exit 1"]
  interval: 10s
  timeout: 5s
  retries: 5

Затем вы можете добавить depends_on в контейнер celery/celerybeat:

depends_on:
  django:
    condition: service_healthy

Это позволит запустить контейнер celery только после прохождения проверки django healthcheck. При проверке здоровья мы просто опрашиваем localhost:8000, потому что когда сервер возвращает ответы, мы можем быть уверены, что миграции были применены.

На данный момент я думаю, что останусь с этим решением:

function check_migrations_status {
  while python manage.py showmigrations | grep '\[ \]'  &> /dev/null; do
    echo "Waiting for all migrations to be completed, please wait ..."
    sleep 3
    done
}
Вернуться на верх