そもそもコンテナ自体を外部からスケジューリングした方が良い場合もあるので、方法論はプロダクトに合わせて検討して下さい(ここではそのへんの細かい話は抜き)

alpineの場合

1分おきに時刻を出力するだけの単純なcronの例

1
2
3
4
5
$ cat Dockerfile
FROM alpine:3

RUN echo '*/1 * * * * date' > /var/spool/cron/crontabs/root
ENTRYPOINT ["crond", "-f"]
1
$ docker build -t hoge .
1
2
3
4
5
$ docker run -d --init hoge | xargs docker logs -f

Wed Mar 11 11:37:00 UTC 2020
Wed Mar 11 11:38:00 UTC 2020
Wed Mar 11 11:39:00 UTC 2020

runは --init付きがオススメ → dockerでtini(–initオプション)を利用するようにしたメモ | 7me

Debianの場合

例として、pythonイメージを使用してます(pythonイメージの大元はDebian

1分おきに python --version を出力するだけの単純なcronの例

1
2
3
4
5
6
7
8
9
10
11
12
FROM python:3

# Install busybox
RUN apt update \
&& apt install -y busybox-static \
&& apt clean && apt autoclean \
&& rm -rf /var/lib/apt/lists/*

RUN mkdir -p /var/spool/cron/crontabs/ \
&& echo '*/1 * * * * python --version' > /var/spool/cron/crontabs/root

ENTRYPOINT ["busybox", "crond", "-f", "-L", "/dev/stderr"]
1
$ docker build -t hoge .
1
2
3
4
5
6
7
8
9
$ docker run -d --init hoge | xargs docker logs -f

crond: crond (busybox 1.30.1) started, log level 8
crond: USER root pid 7 cmd python --version
Python 3.8.2
crond: USER root pid 7 cmd python --version
Python 3.8.2
crond: USER root pid 7 cmd python --version
Python 3.8.2