Docker 并行运行 cron 作业

Posted

技术标签:

【中文标题】Docker 并行运行 cron 作业【英文标题】:Docker run cron jobs in parallel 【发布时间】:2017-11-10 10:02:33 【问题描述】:

使用简单的服务器

我使用一个简单的节点(centos 或 ubuntu)来运行我的 Web 应用程序,并在那里配置了一些 cron 作业来运行计划任务。在那一刻,一切都奏效了。


使用 Docker Swarm 集群

我将我的应用程序迁移到 Docker Swarm 集群。现在 crons 同时在多个容器中运行,这对我来说至关重要。我知道 Docker 正在开发名为 jobs 的新功能,但我现在需要一个解决方案。我想知道是否有任何方法可以只运行一种 cron 作业进程。


拦截器

cron 正在运行以下任务:

创建有关流程的报告。 向其他服务发送通知。 更新应用程序中的数据。

crons 需要在服务器上运行,因为配置为使用 php 命令使用接口和端点。


我的问题

我创建了同一个 docker 服务的多个实例以提供可用性。所有实例都在 3 个节点的集群中运行,并且每个实例都在同时并行运行其 cron 作业,我希望每个 docker 服务只运行一个作业。

【问题讨论】:

【参考方案1】:

也许定期创建一个重启条件为 none 和副本 1 的 docker 服务或创建一个副本为 1 和重启条件为 any 的 cron 容器是一种解决方案,它将是调度程序并使用所需的 cron 脚本附加一个卷。

【讨论】:

【参考方案2】:

有多种选择。

    使用锁定在 NFS 或数据库(mysql、Redis 等)上的锁定机制。您可以像这样执行每个作业:/usr/local/bin/locker /path/to/script args。如果锁不可用(阻塞、非阻塞),最好提供 locker 选项以等待锁或立即失败。因此,如果作业是长时间运行的,那么只有第一个会获得锁,其他的都会失败。您可能希望重用 some existing software 以简化创建可靠锁的艰巨工作。

    使用领导者选择。在 swarm 中运行时,必须有一种机制来查询容器列表。仅列出 cron 容器,并按字母顺序对其进行排序。如果当前容器的 id 是第一个,则允许执行。 first=$(get-containers cron | sort | head -n 1); if [[ "$current-id" == "$first" ]]; then ... fi

    在集群外部运行 cron,但使用它通过负载平衡器触发集群内的作业。负载均衡器会选择一个容器来执行任务。例如curl -H 'security-key: xxx' HTTP://the.cluster/my-job

    我确信有特定于 swarm 的工具/方法可用。 A link.

【讨论】:

以上是关于Docker 并行运行 cron 作业的主要内容,如果未能解决你的问题,请参考以下文章

在 docker 中运行 cron python 作业

cron 作业未在 ubuntu 上的 docker 容器内运行

从 docker 堆栈运行 cron 作业的最佳实践

在我在docker容器中重新保存cron文件之前,Cron作业不起作用

在我将 cron 文件重新保存在 docker 容器中之前,Cron 作业不起作用

当我启动我的 docker 容器时,Cron 没有运行