【问题标题】:Handling cron jobs in docker?在 docker 中处理 cron 作业?
【发布时间】:2015-12-13 08:30:51
【问题描述】:

人们通常如何使用 docker 处理 cron 作业?我见过的最常见的情况是会有一个仅运行 crond 和代码库的 sidekick 映像,但是当使用 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

我的 crontab 将如下所示:

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

最初我根本没有源代码并尝试直接使用变量,但是看起来 cronie 并没有将它们呈现给调用的作业(这在绝大多数用例中确实有意义)。我试过以各种方式拉入这个 env 文件,但没有运气,我的程序永远无法读取变量。即使将整个东西包装在一个引入 env 的 shell 脚本中也无法完成这项工作。

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

【问题讨论】:

    标签: cron docker


    【解决方案1】:

    采购 env 文件不起作用,我不知道为什么(最初我是 chmod +xing env 文件,我为这个答案删除了它,所以不是那样)。我最终找到了这个古怪的环境组合来做到这一点。 env 可以从 stdin 设置变量,所以我们只是 catting 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 克隆,它可以处理标准作业格式,但会传递环境并输出到标准输出。

    【讨论】:

      【解决方案2】:

      与标准 Linux 环境中的其他工具相比,Docker 世界中的 Cron(无论出于何种原因)似乎受到的喜爱较少。我发现如何正确地做到这一点不是很明显。

      这是我对这个问题的看法和解决方案。看看docker-vixie-cron 和它的docker 镜像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" 很重要,这样VAR1VAR2 会保留给randomchallenge 看到。

      【讨论】:

        猜你喜欢
        • 2014-11-04
        • 1970-01-01
        • 2011-08-15
        • 2015-01-05
        • 1970-01-01
        • 1970-01-01
        • 2018-12-27
        • 1970-01-01
        • 2013-12-18
        相关资源
        最近更新 更多