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

Man*_*uri 27 linux cron crontab docker devops

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

但没有什么对我有用

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

crontab,cron.d,cron.hourly ......在我的容器中不存在

crontab -e也无法正常工作

我的容器用/ bin/bash运行

Ken*_*ane 84

这是我如何运行我的一个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"]
Run Code Online (Sandbox Code Playgroud)

crontab.txt

*/30 * * * * /script.sh >> /var/log/script.log
Run Code Online (Sandbox Code Playgroud)

entry.sh

#!/bin/sh

# start cron
/usr/sbin/crond -f -l 8
Run Code Online (Sandbox Code Playgroud)

script.sh

#!/bin/sh

# code goes here.
echo "This is a script, run by cron!"
Run Code Online (Sandbox Code Playgroud)

像这样构建

docker build -t mycron .
Run Code Online (Sandbox Code Playgroud)

像这样跑

docker run -d mycron
Run Code Online (Sandbox Code Playgroud)

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

  • 请在答案中添加“RUN apk add --update apk-cron && rm -rf /var/cache/apk/*”以获取完整示例。有很多方法可以将 cron 添加到 alpine 中,这就是适合您的示例的方法。 (6认同)
  • 嗨,为什么有 2 个 ADD 和 1 个 COPY?,根据我读到的内容,3 COPY 或 3 ADD 可以正常工作(在这种情况下)。我对吗? (3认同)
  • `crond -f -l 8`,8是什么意思?根据 man 的说法,日志级别是大写的“L”。 (2认同)
  • 默认情况下,我没有看到 crond 在容器中运行。我必须执行并运行 crond,这实际上触发了 cron 作业。我在这里缺少什么吗? (2认同)

TVK*_*TVK 16

谢谢你的模板.

我只想知道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
Run Code Online (Sandbox Code Playgroud)

所以也许你想宁愿把小l

/usr/sbin/crond -f -l 8

而不是大'L'

/usr/sbin/crond -f -L 8

将日志级别设置为默认值,因为指定的日志文件8似乎不是预期的.


Jar*_*zki 10

crond在 Alpine 上与tiny配合良好

RUN apk add --no-cache tini

ENTRYPOINT ["/sbin/tini", "--"]
CMD ["/usr/sbin/crond", "-f"]
Run Code Online (Sandbox Code Playgroud)

但不应作为容器主进程(PID 1)运行,因为僵尸收割问题和信号处理问题。有关详细信息,请参阅此 Docker PR此博客文章

  • 为什么不应该作为 PID1 运行? (2认同)

Jes*_*sta 10

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

要在没有额外文件的情况下执行此操作:

解决方法是在entrypoint.sh文件中设置 cron。

Dockerfile


...

# Your Dockerfile above


COPY entrypoint.sh /
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
Run Code Online (Sandbox Code Playgroud)

入口点.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

...

Run Code Online (Sandbox Code Playgroud)