debian ベースの Docker コンテナで busybox の cron を実行

DockerHub の言語系のイメージは(alpine のもあるけれども)debian ベースのものが多いですが cron でスクリプトを定期的に実行しようとして、

RUN apt-get update && apt-get install -y cron

とかすると、

  • cron から実行するスクリプトにコンテナの環境変数が渡されない
    • コンテナの開始時に環境変数をファイルに書いて cron から実行するスクリプトで読んだり
  • スクリプトの標準出力や標準エラーがどこに行くのかよくわからない
    • スクリプトはログをファイルに出力して tail -f したり
    • そのログだれがローテートするの?

とか、とてもつらそうです。

ので、cron の代わりに michaloo/go-cron を使ってみたりしてたのですが、下記の記事を見まして、

もしかして busybox の crond ならそういう諸々の問題は無いのでは? と思って試しました。

Dockerfile

FROM php:7.1-cli

RUN apt-get update && apt-get -y install busybox-static

COPY crontab /var/spool/cron/crontabs/root
COPY script.php /app/script.php

CMD busybox crond -l 2 -L /dev/stderr -f

crontab

* * * * * php /app/script.php

script.php

<?php
system('env | sort | grep OREORE');
fprintf(STDERR, "%s: this is stderr\n", date('H:i:s'));

ビルドして実行します。

docker build . -t oreore/example-php-cron
docker run --name=oreore -e OREORE=12345 --rm oreore/example-php-cron

環境変数 OREORE=12345 がスクリプトに渡って、かつ、スクリプトの標準出力や標準エラーがそのまま Docker に伝わっています。

crond: crond (busybox 1.22.1) started, log level 2
crond: USER root pid   6 cmd php /app/script.php
OREORE=12345
10:50:05: this is stderr
crond: USER root pid  12 cmd php /app/script.php
OREORE=12345
10:51:01: this is stderr