首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在docker中处理cron作业?

在docker中处理cron作业?
EN

Stack Overflow用户
提问于 2015-09-17 00:24:23
回答 2查看 1.2K关注 0票数 1

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

具体地说,我将这样做:

代码语言:javascript
复制
docker run -d --name cron -e VAR1=val1 -e VAR2=val2 cron_image start

在图像内部,我们将拥有以下内容:

代码语言:javascript
复制
[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将如下所示:

代码语言:javascript
复制
SHELL=/bin/bash
5 16 * * * source /var/tmp/docker_env; /usr/local/bin/randomchallenge &> /var/log/randomchallenge.log

最初,我根本没有源代码,并尝试直接使用变量,但是看起来不像cronie将它们呈现给称为作业(这在绝大多数用例中都是有意义的)。我已经尝试了各种方法来拉入这个env文件,但我的程序永远不能读取变量。即使将整个代码包装在一个引入env的shell脚本中也不能完成任务。

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

EN

回答 2

Stack Overflow用户

发布于 2015-09-18 21:56:21

获取env文件不起作用,我不确定原因(最初我是chmod +xing环境文件,我删除了它,所以它不是那样的)。我最终找到了这个摇摇欲坠的环境来做这件事。env可以从stdin设置变量,因此我们只需将env文件连接起来,将其发送到env,然后将该环境用于实际工作。

代码语言:javascript
复制
[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

您需要在每个作业之前添加这一位

代码语言:javascript
复制
env - `cat /var/tmp/docker_env`

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

票数 0
EN

Stack Overflow用户

发布于 2016-04-18 17:38:44

与标准Linux环境中的其他工具相比,docker世界中的Cron (由于某种原因)似乎不太受欢迎。我发现如何正确地做这件事不是很明显。

这是我对这个问题的看法和解决方案。看看docker-vixie-cron和它的docker镜像redmatter/cron,看看它是否对您的场景有帮助。它确实需要一些试验和错误才能得出当前的解决方案,但请随时表达您的想法。

这与您使用cronie所做的事情有很大的不同;下面是如何做的。在您的项目中,您必须添加具有以下行的Dockerfile和带有您的cron定义的crontab.txt

Dockerfile

代码语言:javascript
复制
FROM redmatter/cron

ADD randomchallenge /usr/local/bin/

crontab.txt

代码语言:javascript
复制
*/1 * * * * /usr/local/bin/randomchallenge >>/var/log/randomchallenge.log 2>&1

如果您想使用不同的用户进行root (假设您有另一个共享cron容器的容器),那么您可以另外定义RUN_USER=another.user,然后使用一个名为cron-user add的内置脚本添加该用户,如下面的Dockerfile版本所示。

使用another.user的Dockerfile文件

代码语言:javascript
复制
FROM redmatter/cron

ENV RUN_USER=another.user
RUN cron-user add -u another.user

ADD randomchallenge /usr/local/bin/

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

代码语言:javascript
复制
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查看。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32613930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档