Django + docker +周期性命令
在docker(docker-compose)中运行Django时,运行周期性/计划任务(如manage.py custom_command)的最佳做法是什么?
最常见的情况是 – ./manage.py clearsessions
- Djangobuild议使用cronjobs来运行它…
- 但是,Docker不build议在一个容器中添加多个正在运行的服务。
我想我可以为每个需要运行的命令创build一个docker-compose服务 – 并且该命令应该运行无限循环并且需要睡眠,但是对于每个需要调度的命令
你有什么build议?
用你的Django应用程序创build一个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
在我的Dockerfile中安装/configuration了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中添加一个新的服务,将build立与django项目相同的图像,但将运行cron -f
作为CMD
version: '3' services: web: build: ./myprojectname ports: - "8000:8000" #... cronjobs: build: ./myprojectname command: ["cron", "-f"]