Dockerコンテナ上でCronを使いたい時に、下記の様な事が気になります。
・cronが起動するタスクでは、Dockerコンテナ起動時の環境変数が引き継がれない
・ログは標準出力に書き出してdocker logsでログを拾える様にしたい
調べて見ると,いちいち環境変数を読み込み直して...みたいな感じでもいいものの,こういう時はbusybox に含まれるcrondを使うと楽なようです。
参考:
DockerでcronしたいときはBusyBox crondが便利
debian ベースの Docker コンテナで busybox の cron を実行
以降は参考にした記事に記載されている内容と同一ですが、自分の環境でも試してみたのでその手順を残しておきます。
インストール(Debian系)
※AlpineLinuxの場合はcrondでそのまま使えます
apt-get install -y busybox-static
試してみる
Dockerfileはこんな感じ(ベースイメージはDebian系ならなんでもOK)
FROM openjdk:8-jre
MAINTAINER TOMOHIRO YOSHIE
# インストール
RUN apt-get update && apt-get install -y \
busybox-static \
&& apt-get clean
# タイムゾーン設定
ENV TZ=Asia/Tokyo
# crontabファイルをコピー
COPY crontab /var/spool/cron/crontabs/root
# busybox crond -f -L /dev/stderr
CMD ["busybox", "crond", "-f", "-L", "/dev/stderr"]
crontabファイルはこんな感じ.
* * * * * echo '=== environment variables ===' && env
コンテナを起動すると,cronが動いて環境変数を引き継げていることが確認できた.
[~/work/docker/tmp]# docker build . -t test/crond
[~/work/docker/tmp]# docker run -e FOO=BAR --rm test/crond
crond: crond (busybox 1.22.1) started, log level 8
crond: USER root pid 5 cmd echo '=== environment variables ===' && env
=== environment variables ===
USER=root
HOSTNAME=00de830b4ede
HOME=/root
JAVA_VERSION=8u151
CA_CERTIFICATES_JAVA_VERSION=20170531+nmu1
JAVA_DEBIAN_VERSION=8u151-b12-1~deb9u1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
FOO=BAR
LANG=C.UTF-8
SHELL=/bin/sh
JAVA_HOME=/docker-java-home/jre
PWD=/root
TZ=Asia/Tokyo