web-dev-qa-db-ja.com

追加のファイルを使用せずに、Dockerログを介してcron出力を確認する

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」にログを記録する可能性はありますか?

10
Skip

Cronファイルを以下に変更します

07 2 * * * /data/docker/backup_webserver/backupscript.sh > /dev/stdout

これにより、ログがコンテナの出力に送られます

10
Tarun Lalwani

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が必要です。少なくとも、空の変数を引用符で囲む必要があり、引用符なしの空の変数がある場合はタスクを実行できません。

1
mcfedr

FIFOを使用することもできます。

mkfifo path/to/logs

FIFOを介してデータを交換するプロセスの場合、カーネルはすべてのデータをファイルシステムに書き込まずに渡します。したがって、FIFO specialにはファイルシステムの内容がありません。ファイルシステムエントリは参照ポイントとして機能するだけなので、プロセスはファイルシステムのを使用してパイプにアクセスできます。

man fifo

1