【发布时间】:2015-06-06 03:09:36
【问题描述】:
我已经从 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”在从控制台手动运行时可以正确执行。
有什么想法吗?
【问题讨论】:
-
cron 需要一个守护进程。一半的过程正在创建作业,该作业驻留在 cron 的文件存储中。 cron 的另一半是执行作业。你可以看看:stackoverflow.com/questions/20545554/…。如果您希望主机的 cron 守护进程执行您的 cron 工作,您可能需要在启动容器时挂载主机的 cron 目录?不过这听起来不太好!
-
格雷格,你为什么不把它添加为答案?我正要说同样的话。另请注意,Phusion 映像是在运行 cron 时提供的。
-
@Greg 我现在可以理解你在说什么了。问题是,我不想挂载主机的 cron 目录,也不想在容器内运行 systemd(根据其他一些建议)。我觉得这两种方法都会不必要地“污染”原本干净的系统。我的替代方案是什么?我可以在没有 systemd 的情况下运行 cronie 吗?或者,有其他选择吗?
-
@dsljanus Greg 给你的链接中的建议有什么问题?如果你想运行 cron 和另一个进程,你必须要么在入口点/cmd 脚本中处理它,要么使用 systemd/supervisor/runit 等。
-
@dsljanus 为什么你不能?唯一的问题是如果你不能让它停止分叉到后台。
CMD cron -f工作吗?