如何在docker容器中运行cron作业

时间:2016-05-03 22:44:51

标签: linux docker cron crontab devops

我试图在docker容器中运行一个cron作业

但没有任何对我有用

我的容器只有cron.daily和cron.weekly文件

crontab,cron.d,cron.hourly ......我的容器中没有

crontab -e也无法正常工作

我的容器使用/ bin / bash运行

5 个答案:

答案 0 :(得分:72)

以下是我如何运行我的一个cron容器。

<强> Dockerfile:

FROM alpine:3.3

ADD crontab.txt /crontab.txt
ADD script.sh /script.sh
COPY entry.sh /entry.sh
RUN chmod 755 /script.sh /entry.sh
RUN /usr/bin/crontab /crontab.txt

CMD ["/entry.sh"]

<强> crontab.txt

*/30 * * * * /script.sh >> /var/log/script.log

<强> entry.sh

#!/bin/sh

# start cron
/usr/sbin/crond -f -l 8

<强> script.sh

#!/bin/sh

# code goes here.
echo "This is a script, run by cron!"

像这样构建

docker build -t mycron .

像这样运行

docker run -d mycron

添加自己的脚本并编辑crontab.txt,然后构建图像并运行。由于它是基于高山,因此图像非常小。

答案 1 :(得分:13)

感谢这个模板。

我只想知道 entry.sh

中的一行

/usr/sbin/crond -f -L 8

crond -help产量:

Usage: crond -fbS -l N -d N -L LOGFILE -c DIR

        -f      Foreground
        -b      Background (default)
        -S      Log to syslog (default)
        -l N    Set log level. Most verbose:0, default:8
        -d N    Set log level, log to stderr
        -L FILE Log to FILE
        -c DIR  Cron dir. Default:/var/spool/cron/crontabs

所以也许你想宁愿把小l

/usr/sbin/crond -f -l 8

不是大'L'

/usr/sbin/crond -f -L 8

将日志级别设置为默认值,因为似乎没有指定名为8的日志文件。

答案 2 :(得分:3)

crond 与Alpine上的tiny配合良好

#

但由于僵尸收割问题和信号处理问题,不应该作为容器主进程(PID 1)运行。有关详细信息,请参阅this Docker PRthis blog post

答案 3 :(得分:0)

Here is good explanation of cron problems inside docker container:

Docker文件示例:

FROM alpine

# Copy script which should be run
COPY ./myawesomescript /usr/local/bin/myawesomescript
# Run the cron every minute
RUN echo '*  *  *  *  *    /usr/local/bin/myawesomescript' > /etc/crontabs/root

CMD ['crond', '-l 2', '-f']

答案 4 :(得分:0)

@ken-cochrane 的解决方案可能是最好的,但是,还有一种无需创建额外文件的方法。

无需额外文件即可:

要走的路是在您的 entrypoint.sh 文件中设置 cron。

Dockerfile


...

# Your Dockerfile above


COPY entrypoint.sh /
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

entrypoint.sh


echo "* * * * * echo 'I love running my crons'" >> /etc/crontabs/root
crond -l 2 -f > /dev/stdout 2> /dev/stderr &

# You can put the rest of your entrypoint.sh below this line

...