シェル スクリプトを呼び出す 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 -f
cron「フォアグラウンド」について)も参照してください。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 -f
dockerの最後の出力CMD
が表示されない「」。
詳細は「Docker で Cron を実行する(2021年4月)よりジェイソン・クラトゥンガ、 灰下記にコメント
ジェイソンの画像を見るAnalogJ/docker-cron
に基づく:
ディストリビューションに応じて、
cronie
/ をインストールする Dockerfile です。crond
エントリポイントを初期化して
/etc/environment
呼び出すcron -f -l 2