LoginSignup
15
15

More than 5 years have passed since last update.

Dockerコンテナ上でCronを動かしたい

Posted at

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
15
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
15