Django + docker + 周期性命令

Django + docker + periodic commands

运行宁 periodic/scheduled 任务(如 manage.py custom_command)的最佳实践是什么 运行宁 Django 与 docker( docker-撰写) ?

f.e。最常见的情况 - ./manage.py clearsessions

我想我可以从同一图像为我需要的每个命令创建一个 docker-compose 服务 运行 - 并且该命令应该 运行 具有所需的无限循环睡觉,但是对于每个需要安排的命令来说,这样做似乎有点过头了

你有什么建议?

使用您的 Django 应用程序创建一个 docker 图像。

您可以将它用于 运行 您的 Django 应用程序(Web 界面),同时,使用 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

对我有用的方式

在我的 django 项目中,我有一个这样的 crontab 文件:

0 0 * * * root python manage.py clearsessions     > /proc/1/fd/1 2>/proc/1/fd/2

Installed/configured 我的 Dockerfile 中的 cron

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 -fCMD

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