🕖

【Docker】AlpineとMariaDBのtimezone設定

2021/04/15に公開

dockerコンテナで動かすWebシステムについて、ログ等を考慮して時刻を日本時間で扱いたいと思いました。

Alpine Linux

もともとの状況として、ベースのコンテナイメージでdateコマンドを実行するとUTC時間になっています。

[centos@pmsv02 app]$ sudo docker run -i python:3.7-alpine date
Thu Apr 15 00:33:35 UTC 2021

https://wiki.alpinelinux.org/wiki/Setting_the_timezone
このページで書かれている内容をそのままDockerfileの適当な位置に書き込みます。

RUN apk add tzdata && \
    cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
    echo "Asia/Tokyo" > /etc/timezone && \
    apk del tzdata

ビルドして実行したコンテナでdateコマンドを見ると、反映されていました。

[centos@pmsv02 app]$ sudo docker exec -i app-container date
Thu Apr 15 09:37:07 JST 2021

MariaDB

APサーバの時刻は上記でOKですが、アプリケーションの操作を試すと、DBに登録される日時はUTCのままでした。
使用しているMariaDBのコンテナのtimezone設定がUTCだからです。

MariaDB [(none)]> show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | UTC    |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set (0.001 sec)

調べたところ、起動時に環境変数で「TZ=Asia/Tokyo」を指定すれば良いようです。
https://mariadb.com/kb/en/time-zones/

DIR_PATH=$(cd $(dirname $0); pwd)
sudo docker run -d --rm -p 3306:3306 --name mariadb \
    -v ${DIR_PATH}/data:/var/lib/mysql \
    -e TZ=Asia/Tokyo \
    mariadb:10.5.8 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

これでタイムゾーンがJSTとなり、datetime型が日本時間で保存されるようになりました。

MariaDB [(none)]> show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | JST    |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set (0.001 sec)

Discussion