Dockerコンテナ(Fluentd)のTimeZoneをUTCからJSTに変更する

最近社員ブログの更新が少なく寂しいので、無理してネタを一つ絞り出してみました。

以前ブログでFluentdのDockerコンテナの使い方について説明させて頂きましたが、タイムゾーンについては言及していなかったので、そのことについて書こうと思います。

今回例として挙げたdocker-comopse.ymlやDockerfileの内容について詳しく知りたい方は、下記のブログを御覧ください。

【Docker環境】FluentdとMySQLのbulk insertを使用したログ収集【前編】 【Docker環境】FluentdとMySQLのbulk insertを使用したログ収集【後編】

まず次のディレクトリ構成になるようファイルを用意して下さい。

ディレクトリ構成

.
├── docker-compose.yml
└── fluentd/
           ├── Dockerfile
           └── conf/
                   └── fluent.conf
※fluent.confの中身は空でOKです。

docker-compose.yml

version: '3'

services:
  fluentd:
    build: ./fluentd
    volumes:
      - ./fluentd/conf/fluent.conf:/fluentd/etc/fluent.conf

Dockerfile

FROM fluent/fluentd:v1.11.5-1.0

USER root

# UTC
RUN apk add --no-cache --virtual .build-deps \
    build-base \
    ruby-dev && \
    apk add --no-cache \
    mariadb-dev && \
    gem install fluent-plugin-mysql --no-document && \
    apk del .build-deps

USER fluent

この状態でDockerコンテナの作成&起動をします。

$ docker-compose up -d

Dockerコンテナが起動していることを確認します。

$ docker-compose ps
         Name                       Command               State          Ports       
-------------------------------------------------------------------------------------
fluentd_test_fluentd_1   tini -- /bin/entrypoint.sh ...   Up      24224/tcp, 5140/tcp

ここでDockerコンテナのタイムゾーンを確認したいのですが、手っ取り早いのはログを出力してみることです。

$ docker-compose logs fluentd
Attaching to fluentd_test_fluentd_1
fluentd_1  | 2020-12-22 23:51:58 +0000 [info]: parsing config file is succeeded path="/fluentd/etc/fluent.conf"
fluentd_1  | 2020-12-22 23:51:58 +0000 [info]: gem 'fluent-plugin-mysql' version '0.3.4'
fluentd_1  | 2020-12-22 23:51:58 +0000 [info]: gem 'fluentd' version '1.11.5'
fluentd_1  | 2020-12-22 23:51:58 +0000 [info]: using configuration file: <ROOT>
fluentd_1  | </ROOT>
fluentd_1  | 2020-12-22 23:51:58 +0000 [info]: starting fluentd-1.11.5 pid=7 ruby="2.7.1"
fluentd_1  | 2020-12-22 23:51:58 +0000 [info]: spawn command to main:  cmdline=["/usr/bin/ruby", "-Eascii-8bit:ascii-8bit", "/usr/bin/fluentd", "-c", "/fluentd/etc/fluent.conf", "-p", "/fluentd/plugins", "--under-supervisor"]
fluentd_1  | 2020-12-22 23:52:00 +0000 [info]: #0 starting fluentd worker pid=16 ppid=7 worker=0
fluentd_1  | 2020-12-22 23:52:00 +0000 [info]: #0 fluentd worker is now running worker=0

タイムゾーンが+0000となっているのでUTCで出力されていることがわかります。 なお、このログが出力された時の日本標準時(JST)は2020/12/23 8:52(UTC+9時間)です。

タイムゾーンの変更としてよく例に挙げられているのが、docker-compose.ymlで環境変数TZに「Asia/Tokyo」を指定する方法です。

version: '3'

services:
  fluentd:
    build: ./fluentd
    volumes:
      - ./fluentd/conf/fluent.conf:/fluentd/etc/fluent.conf
    environment:        ← これを追加
      TZ: Asia/Tokyo    ← これを追加

上記の設定を追加してDockerコンテナの破棄&ビルド&起動

$ docker-compose down
$ docker-compose build
$ docker-compose up -d

ログを確認してみると、、、

$ docker-compose logs fluentd
Attaching to fluentd_test_fluentd_1
fluentd_1  | 2020-12-23 00:09:52 +0000 [info]: parsing config file is succeeded path="/fluentd/etc/fluent.conf"
fluentd_1  | 2020-12-23 00:09:52 +0000 [info]: gem 'fluent-plugin-mysql' version '0.3.4'
fluentd_1  | 2020-12-23 00:09:52 +0000 [info]: gem 'fluentd' version '1.11.5'
fluentd_1  | 2020-12-23 00:09:52 +0000 [info]: using configuration file: <ROOT>
fluentd_1  | </ROOT>
fluentd_1  | 2020-12-23 00:09:52 +0000 [info]: starting fluentd-1.11.5 pid=7 ruby="2.7.1"
fluentd_1  | 2020-12-23 00:09:52 +0000 [info]: spawn command to main:  cmdline=["/usr/bin/ruby", "-Eascii-8bit:ascii-8bit", "/usr/bin/fluentd", "-c", "/fluentd/etc/fluent.conf", "-p", "/fluentd/plugins", "--under-supervisor"]
fluentd_1  | 2020-12-23 00:09:53 +0000 [info]: #0 starting fluentd worker pid=16 ppid=7 worker=0
fluentd_1  | 2020-12-23 00:09:53 +0000 [info]: #0 fluentd worker is now running worker=0

変わっていない!!

Nginx、php、Redis、MySQLあたりは環境変数TZの設定でタイムゾーンが変更できるのですが、一部のイメージだと変更できないようです。 Fluentdのように環境変数TZでタイムゾーンが変更できないAlpineのイメージに関しては『tzdata』というパッケージをインストールすれば上手くいくようです。

参考サイト https://wiki.alpinelinux.org/wiki/Setting_the_timezone

参考サイトの内容をDockerfileに反映すると次のようになります(サイト内でThis material is obsolete ...と書いてあるのが若干気になりますが、、、)

FROM fluent/fluentd:v1.11.5-1.0

USER root

#JST
RUN apk add --no-cache --virtual .build-deps \
    build-base \
    ruby-dev \                                               ← &&を外す
    tzdata && \                                              ← これを追加
    cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \    ← これを追加
    echo "Asia/Tokyo" > /etc/timezone && \                   ← これを追加
    apk add --no-cache \
    mariadb-dev && \
    gem install fluent-plugin-mysql --no-document && \
    apk del .build-deps

USER fluent

上記のようにDockerfileを編集したら、docker-compose.ymlの環境変数TZの設定は削除します(最初の状態に戻して下さい) そして、もう一度Dockerコンテナの破棄&ビルド&起動

$ docker-compose down
$ docker-compose build
$ docker-compose up -d

ログを確認してみると、、、

$ docker-compose logs fluentd
Attaching to fluentd_test_fluentd_1
fluentd_1  | 2020-12-23 09:43:54 +0900 [info]: parsing config file is succeeded path="/fluentd/etc/fluent.conf"
fluentd_1  | 2020-12-23 09:43:54 +0900 [info]: gem 'fluent-plugin-mysql' version '0.3.4'
fluentd_1  | 2020-12-23 09:43:54 +0900 [info]: gem 'fluentd' version '1.11.5'
fluentd_1  | 2020-12-23 09:43:54 +0900 [info]: using configuration file: <ROOT>
fluentd_1  | </ROOT>
fluentd_1  | 2020-12-23 09:43:54 +0900 [info]: starting fluentd-1.11.5 pid=7 ruby="2.7.1"
fluentd_1  | 2020-12-23 09:43:54 +0900 [info]: spawn command to main:  cmdline=["/usr/bin/ruby", "-Eascii-8bit:ascii-8bit", "/usr/bin/fluentd", "-c", "/fluentd/etc/fluent.conf", "-p", "/fluentd/plugins", "--under-supervisor"]
fluentd_1  | 2020-12-23 09:43:56 +0900 [info]: #0 starting fluentd worker pid=16 ppid=7 worker=0
fluentd_1  | 2020-12-23 09:43:56 +0900 [info]: #0 fluentd worker is now running worker=0

変わった!!

ダメ押しでDockerコンテナ内でdateコマンドを実行してみると、JSTになっていることが確認できます。

$ docker-compose exec fluentd date
Wed Dec 23 09:45:58 JST 2020

ちょっとハマってしまったのですが、環境変数TZの設定がdocker-compose.ymlに残った状態で、tzdataパッケージをインストールしてもタイムゾーンはUTCのままでしたので、環境変数TZの設定はしないように注意して下さい。

Kitaru

Programmer

Dockerコンテナ(Fluentd)のTimeZoneをUTCからJSTに変更する

お気軽に
お問い合わせください。

お問い合わせ