人们通常是如何使用docker处理cron作业的?我见过的最常见的情况是有一个仅运行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我的crontab将如下所示:
SHELL=/bin/bash
5 16 * * * source /var/tmp/docker_env; /usr/local/bin/randomchallenge &> /var/log/randomchallenge.log最初,我根本没有源代码,并尝试直接使用变量,但是看起来不像cronie将它们呈现给称为作业(这在绝大多数用例中都是有意义的)。我已经尝试了各种方法来拉入这个env文件,但我的程序永远不能读取变量。即使将整个代码包装在一个引入env的shell脚本中也不能完成任务。
人们是如何处理这类事情的?硬编码值不是一个选项。我想我可以让启动脚本在运行时生成crontab,但这看起来真的很难看。
发布于 2015-09-18 21:56:21
获取env文件不起作用,我不确定原因(最初我是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。
发布于 2016-04-18 17:38:44
与标准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版本所示。
使用another.user的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查看。
https://stackoverflow.com/questions/32613930
复制相似问题