日々、雑雑と。

いろいろなことを垂れ流し

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関連のパッケージ組み込んで開発しとけばココらへん悩む必要もなかった。

kakakakakku.hatenablog.com

おわり。