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