DockerコンテナのcronログをFluentdに伝搬する
背景
1つのDockerコンテナ内にメインアプリ用とバッチ処理用のGoバイナリを入れて、メインアプリはpid 1(シェルスクリプト経由で実行)、バッチ処理はcron上で周期的に実行するコンテナを作った。
が、後々Fluentdにログを集約することになったものの、cronで動かしたバッチ処理洋バイナリの標準・エラー出力が集約されなかったので、どうしたもんかとなった。
回避策
cronのログを一旦何かしらのファイルにリダイレクトし、pid 1でtail -fをバックグラウンドで実行すれば、メインアプリと同じ標準出力に乗るからFluentdに集約できるんじゃないの?と考えた。
とりあえず、apiとbatchのバイナリをgo buildで作ったとして以下のファイル構成とする。
~/ ├ app (goバイナリ) ├ batch (goバイナリ) └ batch.log (一時的に)
DockerFileでエントリポイントで実行させるシェルスクリプト
#!bin/sh touch batch.log echo "* * * * * ./bin/batch >> batch.log 2>&1 " >> /var/spool/cron/crontabs/root echo "0 0 * * * : > batch.log" >> /var/spool/cron/crontabs/root && crond tail -f batch.log 2> /dev/null & ./app
一応これで、appもbatchもFluentdに集約できるようになった。が、コンテナの中にcronのログが一時的にdumpするのが最高にキモチワルイ。。。
他の回避案
既に事後だが、あまり美しくない回答なので、他にやりようがないか考えてみた
- batchを単純に1回実行するだけのコンテナを作る
- ホストでcron組んで、定期的にコンテナを立ち上げる
- 共有するファイルやディレクトリは-vでマウント
- アプリ自体にFluentd連携のパッケージを組み込む
最初からアプリ自体にFluentd関連のパッケージ組み込んで開発しとけばココらへん悩む必要もなかった。
おわり。