处理码头工人的cron工作?

时间:2015-09-16 16:24:23

标签: cron docker

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

具体来说,我会这样做:

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

最初我根本没有源位并尝试直接使用变量但是它看起来不像cronie将它们呈现给被调用的作业(这在绝大多数用例中都有意义)。我已经尝试过多种方式拉入这个env文件而没有运气,我的程序永远无法读取变量。甚至将整个事物包装在一个引入env的shell脚本中也不起作用。

人们如何处理这类事情?硬编码值不是一种选择。我想我可以让启动脚本动态生成crontab,但这看起来真的很难看。

2 个答案:

答案 0 :(得分:0)

获取env文件不起作用,我不知道为什么(最初我是chmod文件的chmod + xing,我为此答案删除了它,所以不是这样)。我最终找到了这个不可思议的环境。 env可以从stdin设置变量,所以我们只是抓住我们的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克隆,它可以处理标准作业格式,但是将环境传递给stdout。

答案 1 :(得分:0)

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

以下是我对这个问题的看法和解决方案。查看docker-vixie-cron及其泊坞窗图片redmatter/cron,了解它是否有助于您的方案。它确实需要一些试验和错误来达到目前的解决方案,但请随意发表您的想法。

与你对cronie所做的完全不同;这是怎么回事。在您的项目中,您必须添加具有以下行的Dockerfile和带有您的cron定义的crontab.txt

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的内置脚本;如下面的Dockerfile版本。

Dockerfile与another.user

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",以便为VAR1保留VAR2randomchallenge,以便查看。