【解決】FluentdのDocker公式イメージを使ってプラグインを入れる

結論

  • FluentdのDocker公式イメージを使用してプラグインを入れるときはUSER rootしてからgemを実行する

失敗例

そのままgem installしようとすると失敗します。

FROM fluent/fluentd:v1.11-1
RUN fluent-gem install fluent-plugin-elasticsearch && \
    fluent-gem install fluent-plugin-slack && \
    fluent-gem install fluent-plugin-grep

これをdocker buildすると・・・

ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /usr/lib/ruby/gems/2.5.0 directory.

:
:

[error]: fluent/log.rb:362:error: config error file="/fluentd/etc/fluent.conf" error_class=Fluent::ConfigError error="Unknown output plugin 'elasticsearch'. Run 'gem search -rd fluent-plugin' to find plugins"

と怒られてしまい、buildに失敗します。

原因

Dockerfileでの実行ユーザーが fluent になっているため起こります。 詳しくは以下を参照してください。

hub.docker.com

fluentユーザーでは、 /usr/lib/ruby/gems/2.5.0 への書き込み権限がありません。

成功例

一度USER rootでrootユーザになってからgemを実行します 一通りのgem installが終わったらfluentユーザに戻します。

FROM fluent/fluentd:v1.11-1
+ USER root
RUN fluent-gem install fluent-plugin-elasticsearch && \
    fluent-gem install fluent-plugin-slack && \
    fluent-gem install fluent-plugin-grep
+ USER fluent

これで問題なくdocker buildできました。

まとめ