用 Docker 管理定时任务,依然可以通过 Cron 来进行。
Cron 配置
可以通过以下的方式测试 Docker 中 Cron 的执行:
docker run -ti --rm alpine sh -c \
"echo \"* * * * * echo hello\" | crontab - && crond -f -L /dev/stdout"
运用同样的原理,可以写一个简单的 Dockerfile 如下:
FROM alpine:latest
RUN touch /var/log/cron.log
CMD echo "* * * * * echo 'Hello World' >> /var/log/cron.log 2>&1" | \
crontab - && \
crond -f -L /dev/stdout
在上面的例子中,每一分钟都会输出一个 Hello World 到 /var/log/cron.log
文件中。Cron 的时间书写,可以在这里 进行直观的配置。
时区配置
如果要进行更加复杂的 Cron 配置,很可能就会涉及到时间的问题。默认情况下,Docker 使用的 Linux Alpine 使用的是 UTC 时间。如果配置的 Cron 也需要用 UTC 来书写,显然不直观,也不方便。
简单的处理方法,就是在创建 Docker 的时候,对时区进行配置。比如,将时区设置成北京时间:
FROM alpine:latest
ARG timezone="Asia/Beijing"
RUN apk add tzdata && \
cp /usr/share/zoneinfo/$timezone /etc/localtime && \
echo "$timezone" > /etc/timezone && \
apk del tzdata
RUN touch /var/log/cron.log
CMD echo "30 8 * * * echo 'Wake Up!' >> /var/log/cron.log 2>&1" | \
crontab - && \
crond -f -L /dev/stdout
如上,通过 tzdata 来配置时区,将时间调整成北京时间,进而再执行每日 8:30 的 cronjob,以确保在北京时间的早晨执行某一个命令。