我正在尝试在调用 shell 脚本的 docker 容器中运行 cronjob。
昨天我一直在网上搜索和堆栈溢出,但我真的找不到有效的解决方案。
我怎样才能做到这一点?
原文由 C Heyer 发布,翻译遵循 CC BY-SA 4.0 许可协议
我正在尝试在调用 shell 脚本的 docker 容器中运行 cronjob。
昨天我一直在网上搜索和堆栈溢出,但我真的找不到有效的解决方案。
我怎样才能做到这一点?
原文由 C Heyer 发布,翻译遵循 CC BY-SA 4.0 许可协议
接受的答案 _在生产环境中可能是危险的_。
在 docker 中,每个容器应该只执行一个进程,因为如果不这样做,分叉并进入后台的进程不会受到监控,并且可能会在您不知情的情况下停止。
当你在后台使用 CMD cron && tail -f /var/log/cron.log
cron进程基本上是fork以便在后台执行 cron
,主进程退出并让你在前台执行 tailf
。后台 cron 进程可能会停止或失败,您不会注意到,您的容器仍将静默运行,并且您的编排工具不会重新启动它。
You can avoid such a thing by redirecting directly the cron’s commands output into your
stdout
andstderr
which are located respectively in/proc/1/fd/1
and/proc/1/fd/2
。
使用基本的 shell 重定向,您可能想要执行以下操作:
* * * * * root echo hello > /proc/1/fd/1 2>/proc/1/fd/2
你的 CMD 将是: CMD ["cron", "-f"]
原文由 hugoShaka 发布,翻译遵循 CC BY-SA 4.0 许可协议
2 回答2.4k 阅读✓ 已解决
2 回答772 阅读✓ 已解决
1 回答1.4k 阅读✓ 已解决
2 回答1.4k 阅读
1 回答1.6k 阅读
2 回答1.2k 阅读
1 回答944 阅读
您可以将 crontab 复制到映像中,以便从所述映像启动的容器运行作业。
请参阅 Julien Boulay 在他的
Ekito/docker-cron
中的“ 使用 Docker 运行 cron 作业”:如果您想知道什么是 2>&1, Ayman Hourieh 解释说。
(请参阅 Gaafar 的 评论 和 我如何使
apt-get
安装噪音更小? :apt-get -y install -qq --force-yes cron
也可以工作)正如 Nathan Lloyd 在 评论 中指出的那样:
或者,确保您的工作本身直接重定向到 stdout/stderr 而不是日志文件,如 hugoShaka 的 回答 中所述:
将最后 Dockerfile 行替换为
另请参阅(关于
cron -f
,即 cron “前景”)“ docker ubuntucron -f
不工作”构建并运行它:
埃里克 在评论中 补充道:
请参阅“ 在
tail -f
末尾的CMD
的输出未显示”。在 Jason Kulatunga 的“ 在 Docker 中运行 Cron ”(2021 年 4 月)中查看更多信息,他 在下面评论
参见 Jason 的图片
AnalogJ/docker-cron
基于:Dockerfile 安装
cronie
/crond
,取决于分布。一个入口点初始化
/etc/environment
然后调用