Dockerコンテナで「cron」を実行しています。
毎日スクリプトが実行されます。
「docker logs」を介して確認したいこのスクリプトの出力
PID 0のプロセスは、私のコンテナー内のcronデーモンです。 Entrypointはcronをフォアグラウンドで開始します。
/usr/sbin/crond -f
スクリプトの出力をファイル「path/to/logs」にリダイレクトできることを理解しました
07 2 * * * /data/docker/backup_webserver/backupscript.sh >> path/to/logs
ログを表示するには、次のようにコンテナを起動します
"tail -f path/to/logs"
ただし、「path/to/logs」ファイルは、コンテナの実行中に大きくなります。
crontabから直接「docker logs」にログを記録する可能性はありますか?
Cronファイルを以下に変更します
07 2 * * * /data/docker/backup_webserver/backupscript.sh > /dev/stdout
これにより、ログがコンテナの出力に送られます
fifoを使用する方法です。rootとして実行されていないcronタスクが出力に書き込むことができるため、これも便利です。
これらの線に沿ってCMDを使用しています
ENV LOG_STREAM="/tmp/stdout"
CMD ["bash", "-o", "pipefail", "-c", "mkfifo $$LOG_STREAM && chmod 777 $$LOG_STREAM && echo -e \"$$(env | sed 's/=\\(.*\\)/=\"\\1\"/')\n$$(cat /etc/cron.d/tasks)\" > /etc/cron.d/tasks && cron -f | tail -f $$LOG_STREAM"]
/etc/cron.d/tasks
のタスク
* * * * */10 www-data echo hello >$LOG_STREAM 2>$LOG_STREAM
また、起動時にenvをtasks
の前に追加して、cronがそれ自体を渡さないため、タスクから見えるようにします。 crontab形式ではenv変数を引用符で囲む必要があるため、sed
が必要です。少なくとも、空の変数を引用符で囲む必要があり、引用符なしの空の変数がある場合はタスクを実行できません。
FIFOを使用することもできます。
mkfifo path/to/logs
FIFOを介してデータを交換するプロセスの場合、カーネルはすべてのデータをファイルシステムに書き込まずに渡します。したがって、FIFO specialにはファイルシステムの内容がありません。ファイルシステムエントリは参照ポイントとして機能するだけなので、プロセスはファイルシステムのを使用してパイプにアクセスできます。