在Docker中处理cron作业?

人们如何通常使用docker处理cron作业? 我见过的最常见的情况是会有一个只能运行crond和代码库的搭档图像,但是当使用cronie时,我无法读取在docker命令行中传入的任何环境variables。

具体我会做这个:

docker run -d --name cron -e VAR1=val1 -e VAR2=val2 cron_image start 

在图像里面我们会有这个:

 [root@dae7207bf10e /]# yum info cronie Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: mirror.ash.fastserv.com * epel: mirror.cs.pitt.edu * extras: mirror.vcu.edu * updates: mirror.us.leaseweb.net Installed Packages Name : cronie Arch : x86_64 Version : 1.4.11 Release : 13.el7 Size : 211 k Repo : installed Summary : Cron daemon for executing programs at set times URL : https://fedorahosted.org/cronie License : MIT and BSD and ISC and GPLv2+ Description : Cronie contains the standard UNIX daemon crond that runs specified programs at : scheduled times and related tools. It is a fork of the original vixie-cron and : has security and configuration enhancements like the ability to use pam and : SELinux. [root@dae7207bf10e /]# cat /usr/local/bin/start #!/bin/bash /usr/bin/env > /var/tmp/docker_env /usr/sbin/crond -n 

而我的crontabs将会是这样的:

 SHELL=/bin/bash 5 16 * * * source /var/tmp/docker_env; /usr/local/bin/randomchallenge &> /var/log/randomchallenge.log 

本来我根本就没有源代码,直接使用variables,但是看起来不像cronie把它们呈现给被调用的作业(这在绝大多数用例中是有意义的)。 我已经尝试了多种方式拉这个env文件没有运气,我的程序不能读取variables。 甚至把整个东西包装在一个shell脚本中,并不能完成这个工作。

人们如何处理这种事情? 硬编码值不是一个选项。 我想我可以让启动脚本在飞行中生成crontab,但这似乎很丑陋。

采购env文件不起作用,我不知道为什么(原来我是chmod + xing的env文件,我删除了这个答案,所以不是这样)。 我结束了发现这个不可思议的env kludge去做。 env可以从stdin设置variables,所以我们只是捕获我们的env文件,发送给env,然后使用该环境来处理我们的实际工作。

 [root@b7886c463928 /]# cat /usr/local/bin/start #!/bin/bash env > /var/tmp/docker_env /usr/sbin/crond -n [root@b7886c463928 /]# crontab -l */1 * * * * env - `cat /var/tmp/docker_env` env > /tmp/cron.check 

你需要在每个工作之前添加这一点

 env - `cat /var/tmp/docker_env` 

我将编写一个轻量级的crond克隆,它可以处理标准的作业格式,但将环境传递给标准输出。

docker世界的Cron(由于任何原因)与标准Linux环境中的其他设施相比似乎获得了较less的爱。 我发现如何正确地做到这一点并不是很明显。

这是我的问题和解决scheme。 看看docker – vixie -cron和它的Docker镜像redmatter / cron ,看看它是否有助于你的场景。 为了达到目前的解决scheme,确实需要一些尝试和错误,但是请随时发表你的想法。

和你用cronie做的完全不cronie , 这里是如何。 在你的项目中,你必须添加具有以下行的crontab.txt和一个crontab.txt以及你的cron定义。

Dockerfile

 FROM redmatter/cron ADD randomchallenge /usr/local/bin/ 

crontab.txt

 */1 * * * * /usr/local/bin/randomchallenge >>/var/log/randomchallenge.log 2>&1 

如果你想使用一个不同的用户作为root (也就是说你有另一个容器共享cron容器),那么你可以另外定义RUN_USER=another.user ,然后用一个名为cron-user add的内置脚本cron-user add 。 如下面的Dockerfile版本。

Dockerfile与另一个用户

 FROM redmatter/cron ENV RUN_USER=another.user RUN cron-user add -u another.user ADD randomchallenge /usr/local/bin/ 

在这两种情况下,您都可以使用下面的命令运行容器。

 docker run -d --name cron \ -e PRESERVE_ENV_VARS="VAR1 VAR2" \ -e VAR1=val1 -e VAR2=val2 \ cron_image start 

在这里指定PRESERVE_ENV_VARS="VAR1 VAR2"是非常重要的,这样VAR1VAR2被保留以供randomchallenge查看。