Джанго + докер + периодические команды
Каковы наилучшие практики для запуска периодических / запланированных задач (например, manage.py custom_command) при запуске Django с docker (docker-compose)?
например, самый распространенный случай - ./manage.py clearsessions
- Джанго рекомендует запускать его с cronjobs...
- Но Docker не рекомендует добавлять более одного запущенного сервиса в один контейнер...
Я предполагаю, что могу создать сервис docker-compose из того же образа для каждой команды, которую мне нужно запустить - и команда должна запускать бесконечный цикл с необходимыми циклами ожидания, но это кажется излишним, делая это для каждой команды, которая должна быть запланирована
Какой твой совет?
2 ответа
То, как это работает для меня
в моем проекте Django у меня есть файл crontab, как это:
0 0 * * * root python manage.py clearsessions > /proc/1/fd/1 2>/proc/1/fd/2
Установленный / настроенный cron внутри моего Dockerfile
RUN apt-get update && apt-get -y install cron
ADD crontab /etc/cron.d/crontab
RUN chmod 0644 /etc/cron.d/crontab
и в docker-compose.yml добавьте новый сервис, который будет создавать тот же образ, что и проект django, но будет работать cron -f
как CMD
version: '3'
services:
web:
build: ./myprojectname
ports:
- "8000:8000"
#...
cronjobs:
build: ./myprojectname
command: ["cron", "-f"]
Я закончил тем, что использовал этот проект - Ofelia
https://github.com/mcuadros/ofelia
так что вы просто добавляете его в свой docker-compose
и иметь конфигурацию как:
[job-exec "task name"]
schedule = @daily
container = myprojectname_1
command = python ./manage.py clearsessions
Создайте один образ докера с вашим приложением Django.
Вы можете использовать его для запуска приложения Django (веб-интерфейс) и в то же время, используя cron, планировать задачи периода, передавая команду исполняемому модулю docker, например так:
docker exec --rm your_container python manage.py clearsessions
--rm
удостоверится, что docker удалит контейнер после его завершения; иначе вы быстро остановите контейнеры, которые бесполезны.
Вы также можете передать любые дополнительные аргументы, например, используя -e
изменить среду:
docker exec --rm -e DJANGO_DEBUG=True -e DJANGO_SETTINGS_MODULE=production \
python manage.py clearsessions