我已经从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”正确执行。
有什么想法吗?
答案 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
)。
您可以使用轻量级进程管理器来启动cron以及您需要的任何其他进程(Phusion使用runit,Docker似乎建议使用supervisor)。
您可以编写自己的CMD
或ENTRYPOINT
脚本来启动cron和您的进程。唯一的问题是你需要小心处理信号,否则你最终可能会遇到僵尸进程。
在你的情况下,如果你只是玩游戏,我会选择最后一个选项,如果它更严重,我会选择一个流程经理。
答案 2 :(得分:3)
如果您使用--net = host运行Docker容器,请参阅以下主题: https://github.com/docker/docker/issues/5899
我有同样的问题,当我在docker run命令行参数中包含--pid = host时,我的cron任务开始运行。