docker工人的Cron容器 – 他们是如何工作的?

我一直在使用docker工作了几个月,并且正在处理各种不同的服务器镜像。 一个一致的问题是许多服务器需要运行cron作业。 关于在线(包括Stackoverflow)有很多讨论,但我不完全理解它的机制。

目前,我正在使用主机的cron和docker exec进入每个容器来运行脚本。 我创build了一个关于脚本名称和位置的约定; 我所有的容器都有相同的脚本。 这可以避免主机的cron取决于容器。

基本上,一分钟一次,主机的cron做到这一点:

for each container docker exec -it <containername> /cronscript/minute-script 

这工作,但使容器取决于主机。

我想要做的是创build一个cron容器,在每个其他容器中启动一个脚本 – 但我不知道等效于从一个容器到另一个容器的“docker exec”。

我现在正在使用的具体情况是在MySQL容器中运行备份,运行Moodle作业需要每分钟运行一次。 最后,我会通过cron来做更多的事情。 Moodle使用命令行PHP脚本。

从另一个容器中的一个容器启动脚本的“适当”docker化方法是什么?

更新 :也许这有助于提及我的具体用例,但随着时间的推移会有更多。

目前,cron需要做到以下几点:

  • 从MySQL执行数据库转储。 我可以通过mysqldump从cron容器的TCP链接来做到这一点; 这里的缺点是我不能将备份用户限制在主机127.0.0.1上。 我也可以通过某种方式将MySQL socket套接到cron容器中。
  • 对Moodle安装进行定期维护。 Moodle包含一个运行所有维护任务的php命令行脚本。 这对我来说是个好主意。 我可以通过一个卷来运行这个脚本,但是Moodle的devise并不考虑这种情况,我也不排除竞争条件。 另外,我不希望在卷中安装moodle,因为它会使容器更新变得困难(请记住,在Docker中,当您使用新映像更新容器时,卷不会重新初始化)。
  • 未来:在我的其他服务器上执行例行维护,例如清理电子邮件队列等。

我的解决scheme是:

  • 在容器内安装crond
  • 安装你的软件
  • 运行cron作为守护进程
  • 运行你的软

我的Dockerfile

 FROM debian:jessie RUN mkdir -p /usr/src/app WORKDIR /usr/src/app COPY .crontab /usr/src/app # Set timezone RUN echo "Europe/Warsaw" > /etc/timezone \ && dpkg-reconfigure --frontend noninteractive tzdata # Cron, mail RUN set -x \ && apt-get update \ && apt-get install -y cron rsyslog mailutils --no-install-recommends \ && rm -rf /var/lib/apt/lists/* CMD rsyslogd && env > /tmp/crontab && cat .crontab >> /tmp/crontab && crontab /tmp/crontab && cron -f 

描述

  1. 设置时区,因为cron需要这个适当的运行任务
  2. 用cron守护进程安装cron软件包
  3. 安装rsyslog软件包以loggingcron任务输出
  4. 如果您想从cron任务发送电子邮件,请安装mailutils软件包
  5. 运行rsyslogd
  6. 将ENVvariables复制到tmp文件,因为cron使用最小的ENV和任务运行任务可能需要访问容器的ENVvariables
  7. 追加您的.crontab文件(与您的任务)到tmp文件
  8. 从tmp文件中设置root crontab
  9. 运行cron守护进程

我用这个在我的容器里工作得很好。

一过程每次容器

如果你喜欢这个范例,那么每个cron任务创build一个Dockerfile 。 例如

  • Dockerfile – 主程序
  • Dockerfile_cron_task_1 – cron任务1
  • Dockerfile_cron_task_1 – cron任务2

并build立所有容器:

 docker build -f Dockerfile_cron_task_1 ...