在docker-compose

时间:2018-11-29 10:00:33

标签: docker cron docker-compose celery dockerfile

我正在使用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"

我需要在工作人员服务上运行克朗(计划任务)。

我不想在dockerfile中对crontab进行硬编码,因为我为两个服务都使用了相同的dockerfile。

那么最好的方法是什么?

4 个答案:

答案 0 :(得分:1)

您可以尝试使用以下开源工具在docker-compose中调度cron。

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

答案 1 :(得分:1)

我们开发了一个用于调度作业的简单容器:amplication/scheduler 它用 CRON 包装了一个 HTTP 请求。

用法:

services:
  app:
     # ...
  scheduler:
    image: amplication/scheduler
    command: --request.url http://app/example-route --request.method POST --schedule '* * * * *'

答案 2 :(得分:0)

如果您要运行预定任务,则可能要使用celery beat:http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html#starting-the-scheduler

您可以定义每个任务何时应以cron样式运行。

由芹菜路由器决定在哪里运行每个任务(在哪个工人上): http://docs.celeryproject.org/en/latest/userguide/routing.html

答案 3 :(得分:0)

Docker应该运行single process on each container,所以当您需要执行cron任务时,通常的方法是在主机上运行cron(或作为托管服务,例如@Omkar Kulkani点),然后在“外部”启动运行所需命令的容器。

类似

0,20,40 * * * * docker exec [容器名称] [您的命令在这里]