我正在做一个项目,这是部署在码头群作为一个服务与3个副本。如果日期已过,我想运行一个简单的管理命令来删除表中的一些行。我已经为它写了一个django命令,但希望使用cron作业使运行自动化。我确实希望确保Job每天只从我的服务的任何容器中运行一次。一些包有基于锁的方法,但它是基于文件的锁,而不是共享锁。我不想在这个简单的任务中使用芹菜。
下面是我的命令简介:
class Command(BaseCommand):
"""Command to clear user subscription if end_date has passed"""
def handle(self, *args, **options):
try:
deleted_count, relative_deleted = MyModel.delete_inactive_instances()
except Exception:
raise CommandError('Could Not Remove Inactive Subscriptions From DB')
else:
self.stdout.write(self.style.SUCCESS('Successfully Removed Inactive Subscriptions %s ' % deleted_count))我现在每天都通过docker exec运行一个命令:
python manage.py delete_inactive_instances下面是我的docker-stack文件:
services:
production_app:
image: {id}.dkr.ecr.{region}.amazonaws.com/xxxxxx:latest
expose:
- 8000
deploy:
replicas: 2
command: >
sh -c "python manage.py migrate && gunicorn app.wsgi:application --workers 3 --bind 0.0.0.0:8000"
env_file:
- .prod.env
nginx:
image: {id}.dkr.ecr.{region}.amazonaws.com/nginx:latest
ports:
- 80:80发布于 2020-10-11 08:52:52
你可以使用芹菜和芹菜节拍调度器。它与Django完美集成。在您的docker swarm配置中,您将添加以下服务:
如果你不想在你的集群中添加额外的服务,你也可以在你的django容器中运行芹菜工人作为后台任务。节拍调度程序是控制任务何时运行的调度程序,但它们实际上是由celery工作者执行的
您可以在此项目中找到使用docker compose配置进行工作设置的示例:https://github.com/testdrivenio/django-celery-beat
作为另一种选择,您可以在堆栈配置中使用相同的映像但使用不同的入口点定义一个额外的服务:该服务将只负责运行由入口点定义的cron任务
发布于 2020-10-11 08:40:39
你可以使用芹菜和芹菜节拍调度器。它与Django完美集成。在您的docker swarm配置中,您将添加以下服务:
如果你不想在你的集群中添加额外的服务,你也可以在你的django容器中运行芹菜工人作为后台任务。但是,您应该只运行节拍调度器的一个实例,以防止任务重复。节拍调度器是控制任务何时运行的调度器,但它们实际上是由celery工作者执行的。
您可以在此处找到docker compose配置的示例:https://github.com/testdrivenio/django-celery-beat
https://stackoverflow.com/questions/64292703
复制相似问题