在Docker容器中,cronjobs不会被执行

在Docker容器中,cronjobs不会被执行,cron,docker,Cron,Docker,我已经从Dockerfile创建了一个Docker映像,我希望在基于此映像的容器运行时定期执行cronjob。我的Dockerfile如下(相关部分): 创建映像后,我运行一个容器并验证是否确实添加了cronjob: crontab -l */2 * * * * node /srv/visitor/visitor.js 现在,问题是cronjob永远不会执行。当然,我已经测试了“node/srv/visitor/visitor.js”在从控制台手动运行时是否正确执行 有什么想法吗?要

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

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

crontab -l

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


有什么想法吗?

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

  • 您可以使用Phusion基本映像,它附带了一个init系统和安装的cron。它是基于Ubuntu的,相对来说比较重(至少与archlinux相比)

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

  • 您可以使用轻量级流程管理器来启动cron和您需要的任何其他流程(Docker似乎推荐Phusion使用runit)

  • 您可以编写自己的
    CMD
    ENTRYPOINT
    脚本来启动cron和进程。唯一的问题是,您需要小心地正确处理信号,否则可能会导致僵尸进程


在您的情况下,如果您只是在玩,我会选择最后一个选项,如果更严重,我会选择流程管理器。

一个选项是以以下方式使用主机的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天的多个数据库滚动备份,并在一行中执行bashfor循环,而不是编写和调用shell脚本来执行相同的操作。所以它非常灵活

或者,您也可以将复杂的脚本放入docker容器中,并按如下方式运行它们:

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

如果使用--net=host运行Docker容器,请参阅以下线程:


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

cron需要一个守护进程。一半的过程是创建作业,它驻留在cron的文件存储中。cron的另一半是执行作业。您可以查看:。如果您希望主机的cron守护进程执行cronwork,您可能需要在启动容器时装载hosts cron目录?不过听起来不太好!格雷格,你为什么不加上这个作为答案呢?我正要说同样的话。还要注意的是,Phusion映像随cron一起运行。@Greg我现在可以理解你的意思了。问题是,我既不想挂载主机的cron目录,也不想在容器中运行systemd(根据其他一些建议)。我觉得这两种方法都会不必要地“污染”一个原本清洁的系统。我的选择是什么?我可以在没有系统的情况下运行cronie吗?或者,还有其他选择吗?@dsljanus格雷格给你的链接中的建议怎么了?如果你想运行cron和其他进程,你必须在entrypoint/cmd脚本中处理,或者使用systemd/supervisor/runit等@dsljanus为什么不能?唯一的问题是,如果你不能让它停止转向背景。
CMD cron-f
有效吗?首先,感谢您的详细回答。我倾向于使用第二个选项,使用CMD命令运行cron,因为我只想无限期地每隔2分钟运行一个命令。事实是,Arch并没有“cron”,因为cronie是一个售后服务包。另外,如果这是oveecome,我可以在后台运行cron吗?我不知道cronie的情况,但我希望它也能正常工作。您仍然可以使用
docker exec-it container/bin/bash
进入容器,因此这不是问题。在正在运行的容器中,crond正在运行,并由“ps-aux | grep cron”验证。当然,它是手工表述的。问题是,仍然没有执行任何cronjobs。酷,那么你就接近了。我怀疑现在只是一个cron配置问题;可能它没有拾取您的配置文件或其他内容。crontab文件正确设置了我的作业。如果守护进程也在运行,还需要配置什么?这种方法无法帮助您在应用程序端保持任务配置。
0 5 * * * docker exec mysql /dailyCron.sh