我已经从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”是否可以正确执行。

有任何想法吗?

最佳答案

确切地回答这个问题有点棘手,因为我没有时间进行测试,但是您有很多选择可以解决:

  • 您可以使用Phusion基本镜像,该镜像随附有一个init系统并安装了cron。它基于Ubuntu,相对较重(至少与archlinux相比)https://registry.hub.docker.com/u/phusion/baseimage/
  • 如果您乐意让所有工作都从cron作业开始,则可以只从CMD启动cron并将其放在前台(cron -f)。
  • 您可以使用轻量级进程管理器来启动cron以及所需的任何其他进程(Phusion使用runit,Docker似乎建议使用supervisor)。
  • 您可以编写自己的CMDENTRYPOINT脚本来启动cron和您的进程。唯一的问题是您将需要谨慎处理信号,否则可能会遇到僵尸进程。

  • 在您的情况下,如果您只是在玩耍,我会选择最后一个选择,如果更严重的话,我会选择一个流程经理。

    关于cron - 在Docker容器中,cronjobs没有得到执行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29391327/

    10-16 16:56
    查看更多