Cron in Docker

Docker

用 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,以确保在北京时间的早晨执行某一个命令。