卖兜搞IT

通过Docker container执行计划任务

通过Docker container执行计划任务

crontab大家应该都比较熟悉了,Linux计划任务,再加上一门脚本shell或者python,可以灵活的实现多种计划任务。

如何通过docker container去执行计划任务呢,其实办法挺多的:

•比如执行通过宿主机的crontab去docker run --rm xxxxxxxxxxxx, 定期执行然后清理•比如 直接在container里安装cron,然后安装传统的方式去编辑crontab

但是直接用cron的话,log是一个问题。使用容器的最佳实践之一就是,要把app的log转到stdout,stderr里,不要写到syslog文件里。cron默认是syslog的,所以你还需要做一些额外的重定向工作。

直到最近发现了一个工具supercronic:https://github.com/aptible/supercronic/ 这个专为容器而生的计划任务工具。

用起来很简单,这里给大家一个非常简单的小例子。

FROM alpine:latestRUN apk updateRUN apk --no-cache add curlENV SUPERCRONIC_URL=https://github.com/aptible/supercronic/releases/download/v0.1.12/supercronic-linux-amd64 \    SUPERCRONIC=supercronic-linux-amd64 \    SUPERCRONIC_SHA1SUM=048b95b48b708983effb2e5c935a1ef8483d9e3eRUN curl -fsSLO "$SUPERCRONIC_URL" \&& echo "${SUPERCRONIC_SHA1SUM}  ${SUPERCRONIC}"| sha1sum -c - \&& chmod +x "$SUPERCRONIC" \&& mv "$SUPERCRONIC""/usr/local/bin/${SUPERCRONIC}" \&& ln -s "/usr/local/bin/${SUPERCRONIC}"/usr/local/bin/supercronicCOPY my-cron /app/my-cron# RUN cron jobCMD ["/usr/local/bin/supercronic","/app/my-cron"]

使用的my-cron就是一个crontab格式的计划任务,比如, 每隔一分钟输出时间到一个文件里

*/1 * * * * date >> /root/test.txt

这里给大家推荐一个写crontab规则的网站https://crontab.guru

Image

~# tail -f /root/test.txtThuJan2823:01:00 UTC 2021ThuJan2823:02:00 UTC 2021

就是这样简单,如果想执行python的话,可以换个base image,根据自己的需求灵活改变,创建自己的dockers image。