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