FluentdはプロセスにシグナルSIGUSR1を送るとバッファーを強制的にフラッシュしてくれます。
そのため、Fluentdのコンテナを差し替えたい場合に、もしFluentdのファイルバッファを永続化しない運用をしていたとしても、
FluentdにSIGUSR1を送ってフラッシュしてからコンテナを停止し、別コンテナを起動すれば問題ないように思えます。(*1)
しかし、現在のところバグによりtime_slice_waitを指定している場合はSIGUSR1を送ってもフラッシュしないようです。
https://github.com/fluent/fluentd/pull/533
この問題の修正は2015/01/15にマージされており、fluentd 0.10.59から反映されています。
td-agentを使っている場合、まだこのバージョンに対応したパッケージが提供されていないため、
- ファイルバッファをデータボリュームなどに永続化する
- ログの送信元をシャットダウンしたうえで、time_slice_waitに達してフラッシュされるまで待つ
といった運用をしなければなりません。
(*1) コンテナの停止中にログの取得漏れがないようにFluentd自体は冗長化されている前提です。
追記 2015/03/22
docker cpとdocker execを使うことでホスト-コンテナ間を自由にファイル移動できることを知りました。
Fluentdのバッファーがひとつのディレクトリにまとまっていれば比較的簡単にバッファーファイルを移動できます。
データ用コンテナを使うのが一番よいのでしょうが、ファイルコピーもひとつの方法になります。
バッファファイルのコンテナからコンテナへの移し方
/var/log/td-agent/buffer にバッファファイルがまとまっているものとします。
コンテナからホストにバッファをコピー
docker exec -i <コンテナ名> tar -cv -C /var/log/td-agent buffer > buffer.tar
ホストからコンテナにコピー
#tarをコンテナにコピー
docker exec -i <コンテナ名> /bin/bash -c 'cat > /var/log/td-agent/buffer.tar' < buffer.tar
#コンテナのtarを展開
docker exec -i <コンテナ名> /bin/bash -c 'cd /var/log/td-agent; tar xf buffer.tar'