在Docker容器内部,cronjobs没有被执行

时间:2015-04-01 12:51:34

标签: cron docker

我已经从Dockerfile创建了一个Docker镜像,并且我希望在基于此镜像的容器运行时定期执行cronjob。我的Dockerfile就是这个(相关部分):

FROM l3iggs/archlinux:latest

COPY source /srv/visitor

WORKDIR /srv/visitor

RUN pacman -Syyu --needed --noconfirm \
        && pacman -S --needed --noconfirm make gcc cronie python2 nodejs phantomjs \
        && printf "*/2 * * * *       node /srv/visitor/visitor.js \n" >> cronJobs \
        && crontab cronJobs \
        && rm cronJobs \
        && npm install -g node-gyp \
        && PYTHON=/usr/sbin/python2 && export PYTHON \
        && npm install

EXPOSE 80

CMD ["/bin/sh", "-c"]

创建图像后,我运行一个容器,确认确实添加了cronjob:

crontab -l

*/2 * * * *     node /srv/visitor/visitor.js

现在,问题是cronjob永远不会被执行。当然,我已经测试过,当从控制台手动运行时,“node /srv/visitor/visitor.js”正确执行。

有什么想法吗?

3 个答案:

答案 0 :(得分:8)

一种选择是以下列方式使用主机的crontab:

0 5 * * * docker exec mysql mysqldump --databases myDatabase -u myUsername -pmyPassword > /backups/myDatabase.sql

以上将定期每日备份MySQL数据库。

如果您需要链接复杂的命令,您也可以使用以下格式:

0 5 * * * docker exec mysql sh -c 'mkdir -p /backups/`date +\%d` && for DB in myDB1 myDB2 myDB3; do mysqldump --databases $DB -u myUser -pmyPassword > /backups/`date +\%d`/$DB.sql; done'

上面需要对多个数据库进行30天的滚动备份,并在一行中执行bash for循环,而不是编写和调用shell脚本来执行相同操作。所以它很灵活。

或者您也可以将复杂的脚本放在docker容器中并像这样运行它们:

0 5 * * * docker exec mysql /dailyCron.sh

答案 1 :(得分:6)

要明确回答这个问题有点棘手,因为我没有时间去测试,但你有各种各样的选择:

  • 您可以使用Phusion基本映像,它随附一个init系统和cron。它基于Ubuntu并且相对较重(至少与archlinux相比)https://registry.hub.docker.com/u/phusion/baseimage/

  • 如果您乐意从cron作业开始,您可以从CMD启动cron并将其保留在前台(cron -f)。

    < / LI>
  • 您可以使用轻量级进程管理器来启动cron以及您需要的任何其他进程(Phusion使用runit,Docker似乎建议使用supervisor)。

  • 您可以编写自己的CMDENTRYPOINT脚本来启动cron和您的进程。唯一的问题是你需要小心处理信号,否则你最终可能会遇到僵尸进程。

在你的情况下,如果你只是玩游戏,我会选择最后一个选项,如果它更严重,我会选择一个流程经理。

答案 2 :(得分:3)

如果您使用--net = host运行Docker容器,请参阅以下主题: https://github.com/docker/docker/issues/5899

我有同样的问题,当我在docker run命令行参数中包含--pid = host时,我的cron任务开始运行。