1. ホーム
  2. docker

[解決済み] dockerコンテナ内でcronジョブを実行するには?

2022-03-22 10:06:18

質問

シェルスクリプトを呼び出すドッカーコンテナ内でcronjobを実行しようとしています。

昨日、ウェブとスタックオーバーフローをくまなく探しましたが、うまくいく解決策は本当に見つかりませんでした。
どうすればいいのでしょうか?

EDITです。

を作成しました。 (コメント付き)githubリポジトリ このコンテナは、指定された間隔でシェルスクリプトを呼び出します。

解決方法は?

イメージにcrontabをコピーしておけば、そのイメージから起動したコンテナがジョブを実行するようになります。

"を参照してください。 Dockerでcronジョブを実行する をご覧ください。 ジュリアン・ブーレー で、彼の Ekito/docker-cron :

新規に"というファイルを作成しましょう。 hello-cron "を使って仕事を記述します。

* * * * * echo "Hello world" >> /var/log/cron.log 2>&1
# An empty line is required at the end of this file for a valid cron file.

2>&1ってなんだろうと思っている方。 アイマン・ホウリイ 説明する .

次のDockerfileは、イメージを構築するためのすべてのステップを記述しています。

FROM ubuntu:latest
MAINTAINER [email protected]

RUN apt-get update && apt-get -y install cron

# Copy hello-cron file to the cron.d directory
COPY hello-cron /etc/cron.d/hello-cron
 
# Give execution rights on the cron job
RUN chmod 0644 /etc/cron.d/hello-cron

# Apply cron job
RUN crontab /etc/cron.d/hello-cron
 
# Create the log file to be able to run tail
RUN touch /var/log/cron.log
 
# Run the command on container startup
CMD cron && tail -f /var/log/cron.log

(参照 ガァファル 's コメント を作るにはどうしたらいいのでしょうか? apt-get をインストールすると、ノイズが少なくなりますか? :
apt-get -y install -qq --force-yes cron も使えます)

にもあるように ネイサン・ロイド コメント :

ゴチャゴチャについて簡単にメモ。
スクリプト・ファイルを追加して、それを実行するようにcronに指示する場合、次のことを忘れないでください。
RUN chmod 0744 /the_script
Cronは忘れると黙って失敗する .


または、ジョブ自体がログファイルではなく、stdout/stderrに直接リダイレクトするようにしてください。 ヒューゴシャカ 's 答え :

 * * * * * root echo hello > /proc/1/fd/1 2>/proc/1/fd/2

Dockerfileの最後の行を次のように置き換えます。

CMD ["cron", "-f"]

も参照してください(約 cron -f は、cron "foreground"を意味する) "。 ドッカーウブントゥ cron -f が動作しない "。


ビルドして実行します。

sudo docker build --rm -t ekito/cron-example .
sudo docker run -t -i ekito/cron-example

2分ほど待つと、コマンドラインが表示されるはずです。

Hello world
Hello world


エリック が追加されます。 コメントで :

ご注意ください tail は、イメージビルド中に作成された場合、正しいファイルを表示しないことがあります。
この場合、tail が正しいファイルをピックアップするために、コンテナ実行時にファイルを作成するか、タッチする必要があります。

"をご覧ください。 の出力 tail -f の末尾にあるdocker CMD が表示されない "です。


詳しくは"でご覧ください。 DockerでCronを実行する "(2021年4月)より。 ジェイソン・クラトゥンガ として 以下のコメント

ジェイソンの画像を見る AnalogJ/docker-cron をベースにしたものです。

  • Dockerfileのインストール cronie / crond ディストリビューションによって異なります。

  • を初期化するエントリポイント。 /etc/environment を呼び出して

    cron -f -l 2