人们如何通常使用码头工作处理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,但这看起来真的很难看。
答案 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
。
FROM redmatter/cron
ADD randomchallenge /usr/local/bin/
*/1 * * * * /usr/local/bin/randomchallenge >>/var/log/randomchallenge.log 2>&1
如果您想使用其他用户root
(比如因为您有另一个容器共享cron
容器),那么您可以另外定义RUN_USER=another.user
然后添加用户一个名为cron-user add
的内置脚本;如下面的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"
,以便为VAR1
保留VAR2
和randomchallenge
,以便查看。