Джанго + докер + периодические команды

Каковы наилучшие практики для запуска периодических / запланированных задач (например, 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
Другие вопросы по тегам