Dockerコンテナ内でcronジョブを実行するにはどうすればいいですか? 質問する

Dockerコンテナ内でcronジョブを実行するにはどうすればいいですか? 質問する

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

これどうやってするの?

ベストアンサー1

crontabイメージにコピーして、そのイメージから起動されたコンテナでジョブを実行できます。


重要: 記載の通りdocker-cron 問題 3: 使用CRLFではなくLFあなたのファイル用cron


見る "Dockerでcronジョブを実行する" からジュリアン・ブーレイ彼のEkito/docker-cron:

hello-cronジョブを記述するために、「 」という新しいファイルを作成しましょう。

# must be ended with a new line "LF" (Unix) and not "CRLF" (Windows)
* * * * * 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

しかし、もしcron死んだら、コンテナは走り続ける

(見るガアファーコメントそしてインストール時のノイズを減らすにはどうすればよいですかapt-get?:
apt-get -y install -qq --force-yes cronも使えます)

次のように指摘されている。ネイサン・ロイドコメント:

注意点について簡単に説明します。
スクリプト ファイルを追加して cron に実行を指示する場合は、を忘れると cron がサイレントに失敗します
RUN chmod 0744 /the_script

警告: に記載されているとおりコメントによるユーザー8046323

この構成では、タスクを 2 回スケジュールします。

  • 一度crontabだけ
  • 一度だけcron.d

タスクを2回スケジュールすることを回避するには、1つの方法のみを使用してください。

確かに、問題は上記の Dockerfile の次の 2 行にあります。

COPY hello-cron /etc/cron.d/hello-cron
RUN crontab /etc/cron.d/hello-cron
  • hello-cronファイルをディレクトリに配置すると/etc/cron.d、このファイルに含まれる cron ジョブが自動的にスケジュールされます。cron デーモンは、このディレクトリで cron スケジュールを含むファイルをチェックし、自動的に読み込みます。

  • コマンドcrontabはファイル/etc/cron.d/hello-cronの内容を取得しhello-cron、それをメインの crontab にロードします。つまり、同じジョブが crontab でも直接スケジュールされ、実質的に複製されます。

特定のニーズに応じて、cron ジョブを管理する方法を 1 つ選択する必要があります。

  • 使用したい場合/etc/cron.d(複数の個別の cron ジョブ ファイルを管理する方が簡単な場合が多い):

    COPY hello-cron /etc/cron.d/hello-cron
    RUN chmod 0644 /etc/cron.d/hello-cron
    
  • 使用したい場合crontab(すべての cron ジョブの統合ビューが提供され、単一または少数のジョブの場合は簡単になります):

    ADD hello-cron /etc/cronjob
    RUN crontab /etc/cronjob
    

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

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

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

CMD ["cron", "-f"]

しかし、タスクを実行したい場合は機能しません非ルートとして

cron -fcron「フォアグラウンド」について)も参照してください。docker ubuntuが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 -fdockerの最後の出力CMDが表示されない「」。


詳細は「Docker で Cron を実行する(2021年4月)よりジェイソン・クラトゥンガ、 灰下記にコメント

ジェイソンの画像を見るAnalogJ/docker-cronに基づく:

  • ディストリビューションに応じて、cronie/ をインストールする Dockerfile です。crond

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

    cron -f -l 2
    

おすすめ記事