プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2022/07/02

Telegraf が docker.sock にアクセスできない

event_note2022/07/02 0:38

Docker コンテナ内で Telegraf を動かして、Docker の情報を収集するには /var/run/docker.sock をマウントする必要がありますが、それだけでは以下のように Got permission denied のエラーが表示されました。

E! [inputs.docker] Error in plugin: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/info": dial unix /var/run/docker.sock: connect: permission denied
E! [inputs.docker] Error in plugin: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json?filters=%7B%22status%22%3A%7B%22running%22%3Atrue%7D%7D&limit=0": dial unix /var/run/docker.sock: connect: permission denied

Telegraf の 1.20.3 以降、Telegraf の実行ユーザーは telegraf という非 root ユーザーに変わったらしいです。

なので、Telegraf の実行ユーザーが docker コマンドを実行できるように、以下のように user を指定する必要があるそうです。

$ docker run --user telegraf:$(stat -c '%g' /var/run/docker.sock) ...

docker-compose の場合

yml 内ではシェル変数を参照できないので、あらかじめ環境変数を設定しておくなど、少し工夫が必要です。

$ export TELEGRAF_UID_GID=telegraf:$(stat -c '%g' /var/run/docker.sock)

docker-compose.yml で環境変数を参照します。

user: ${TELEGRAF_UID_GID}

ここらへんについては以下の記事が参考になると思います。