ブログ
これまでに経験してきたプロジェクトで気になる技術の情報を紹介していきます。
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の設定はしないように注意して下さい。
コメントはありません。