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

dsl*_*nus 9 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"]
Run Code Online (Sandbox Code Playgroud)

创建映像后,我运行一个容器并验证确实已添加了cronjob:

crontab -l

*/2 * * * *     node /srv/visitor/visitor.js
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

sne*_*nez 8

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

0 5 * * * docker exec mysql mysqldump --databases myDatabase -u myUsername -pmyPassword > /backups/myDatabase.sql
Run Code Online (Sandbox Code Playgroud)

以上将定期每日备份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'
Run Code Online (Sandbox Code Playgroud)

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

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

0 5 * * * docker exec mysql /dailyCron.sh
Run Code Online (Sandbox Code Playgroud)


Adr*_*uat 6

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

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

  • 如果你很高兴从cron作业开始,你可以从你的cron启动CMD它并将它保存在前台(cron -f).

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

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

在你的情况下,如果你刚刚玩,我会选择最后一个选项,如果它更严重,我会选择一个流程经理.