Dockerコンテナ内でcronジョブを実行しようとしました
しかし、私には何も機能しません
私のコンテナにはcron.dailyとcron.weeklyファイルしかありません
crontab、cron.d、cron.hourly ...がコンテナにありません
crontab -eも機能しない
私のコンテナは/ bin/bashで実行されます
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を編集し、イメージをビルドして実行するだけです。アルパインに基づいているため、画像は非常に小さいです。
このテンプレートをありがとう。
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
という名前のログファイルを指定することは意図されていないため、ログレベルをデフォルトに設定します。
crondは、Alpineの tiny でうまく機能します
RUN apk add --no-cache tini
ENTRYPOINT ["/sbin/tini", "--"]
CMD ["/usr/sbin/crond", "-f"]
ただし、ゾンビの収獲の問題と信号処理の問題のため、コンテナのメインプロセス(PID 1)として実行しないでください。 このDocker PR および このブログ投稿 を参照してください。