web-dev-qa-db-ja.com

Dockerコンテナー内でcronジョブを実行する方法

Dockerコンテナ内でcronジョブを実行しようとしました

しかし、私には何も機能しません

私のコンテナにはcron.dailyとcron.weeklyファイルしかありません

crontab、cron.d、cron.hourly ...がコンテナにありません

crontab -eも機能しない

私のコンテナは/ bin/bashで実行されます

25
Manoj Kalluri

Cronコンテナーの1つを実行する方法を次に示します。

Dockerfile:

FROM Alpine:3.3

ADD crontab.txt /crontab.txt
ADD script.sh /script.sh
COPY entry.sh /entry.sh
RUN chmod 755 /script.sh /entry.sh
RUN /usr/bin/crontab /crontab.txt

CMD ["/entry.sh"]

crontab.txt

*/30 * * * * /script.sh >> /var/log/script.log

entry.sh

#!/bin/sh

# start cron
/usr/sbin/crond -f -l 8

script.sh

#!/bin/sh

# code goes here.
echo "This is a script, run by cron!"

そのように構築する

docker build -t mycron .

そのように実行します

docker run -d mycron

独自のスクリプトを追加してcrontab.txtを編集し、イメージをビルドして実行するだけです。アルパインに基づいているため、画像は非常に小さいです。

76
Ken Cochrane

このテンプレートをありがとう。

entry.shの1行についてだけ疑問に思う

/usr/sbin/crond -f -L 8

crond -helpの結果:

Usage: crond -fbS -l N -d N -L LOGFILE -c DIR

        -f      Foreground
        -b      Background (default)
        -S      Log to syslog (default)
        -l N    Set log level. Most verbose:0, default:8
        -d N    Set log level, log to stderr
        -L FILE Log to FILE
        -c DIR  Cron dir. Default:/var/spool/cron/crontabs

だから、あなたはむしろ小さなl

/usr/sbin/crond -f -l 8

大きな「L」の代わりに

/usr/sbin/crond -f -L 8

8という名前のログファイルを指定することは意図されていないため、ログレベルをデフォルトに設定します。

14
TVK

crondは、Alpineの tiny でうまく機能します

RUN apk add --no-cache tini

ENTRYPOINT ["/sbin/tini", "--"]
CMD ["/usr/sbin/crond", "-f"]

ただし、ゾンビの収獲の問題と信号処理の問題のため、コンテナのメインプロセス(PID 1)として実行しないでください。 このDocker PR および このブログ投稿 を参照してください。

3