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
}