在 docker-compose 中为特定服务添加 cron 作业(计划任务)的最佳方法是什么
What is the best approach for adding cron jobs (scheduled tasks) for a particular service in docker-compose
我正在使用 docker-compose。我有一个网络和一个工人服务。
version: '3'
services:
web:
build: .
environment:
- "*"
links:
- redis
- memcached
ports:
- "80:8001"
- "443:8001"
worker:
build: .
command: ["/bin/bash", "/home/django/start_celery.sh"]
environment:
- "*"
links:
- redis
- memcached
memcached:
image: memcached
ports:
- "11211:11211"
redis:
image: redis
ports:
- "6379:6379"
我需要 运行 工人服务上的 crons(计划任务)。
而且我不想在 Dockerfile 中对 crontab 进行硬编码,因为我对这两种服务使用相同的 docker 文件。
那么最好的方法是什么?
如果你想 运行 计划任务你可能想使用 celery beat: https://docs.celeryq.dev/en/stable/userguide/periodic-tasks.html?highlight=periodic#starting-the-scheduler.
您可以在 cron 样式中定义每个任务何时 运行。
决定运行每个任务(在哪个worker上)由celery router完成:
https://docs.celeryq.dev/en/stable/userguide/routing.html
您可以尝试使用以下开源工具在 docker-compose 中安排 crons。
https://github.com/mcuadros/ofelia
例如:
[job-service-run "service-executed-on-new-container"]
schedule = 0,20,40 * * * *
image = ubuntu
network = swarm_network
command = touch /tmp/example
如果您打算在任何云平台中使用图像。
例如。
AWS:您还可以查看 ECS 调度程序
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/scheduled_tasks.html
GCP:Kubernetes 引擎 CronScheduler
https://cloud.google.com/kubernetes-engine/docs/how-to/cronjobs
Docker 应该 运行 a single process on each container 所以当你需要类似 cron 的任务时,通常的方法是在主机上 运行 cron(或作为@Omkar Kulkani 之类的托管服务点),然后 "outside" 启动容器 运行 执行您需要的命令。
类似
0,20,40 * * * * docker exec [容器名称] [你的命令在这里]
我们开发了一个用于调度作业的简单容器:amplication/scheduler它用 CRON 包装了一个 HTTP 请求。
用法:
services:
app:
# ...
scheduler:
image: amplication/scheduler
command: --request.url http://app/example-route --request.method POST --schedule '* * * * *'
我正在使用 docker-compose。我有一个网络和一个工人服务。
version: '3'
services:
web:
build: .
environment:
- "*"
links:
- redis
- memcached
ports:
- "80:8001"
- "443:8001"
worker:
build: .
command: ["/bin/bash", "/home/django/start_celery.sh"]
environment:
- "*"
links:
- redis
- memcached
memcached:
image: memcached
ports:
- "11211:11211"
redis:
image: redis
ports:
- "6379:6379"
我需要 运行 工人服务上的 crons(计划任务)。
而且我不想在 Dockerfile 中对 crontab 进行硬编码,因为我对这两种服务使用相同的 docker 文件。
那么最好的方法是什么?
如果你想 运行 计划任务你可能想使用 celery beat: https://docs.celeryq.dev/en/stable/userguide/periodic-tasks.html?highlight=periodic#starting-the-scheduler.
您可以在 cron 样式中定义每个任务何时 运行。
决定运行每个任务(在哪个worker上)由celery router完成: https://docs.celeryq.dev/en/stable/userguide/routing.html
您可以尝试使用以下开源工具在 docker-compose 中安排 crons。
https://github.com/mcuadros/ofelia
例如:
[job-service-run "service-executed-on-new-container"]
schedule = 0,20,40 * * * *
image = ubuntu
network = swarm_network
command = touch /tmp/example
如果您打算在任何云平台中使用图像。
例如。
AWS:您还可以查看 ECS 调度程序
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/scheduled_tasks.html
GCP:Kubernetes 引擎 CronScheduler
https://cloud.google.com/kubernetes-engine/docs/how-to/cronjobs
Docker 应该 运行 a single process on each container 所以当你需要类似 cron 的任务时,通常的方法是在主机上 运行 cron(或作为@Omkar Kulkani 之类的托管服务点),然后 "outside" 启动容器 运行 执行您需要的命令。
类似
0,20,40 * * * * docker exec [容器名称] [你的命令在这里]
我们开发了一个用于调度作业的简单容器:amplication/scheduler它用 CRON 包装了一个 HTTP 请求。
用法:
services:
app:
# ...
scheduler:
image: amplication/scheduler
command: --request.url http://app/example-route --request.method POST --schedule '* * * * *'