[Docker] php.iniでtimezoneを設定しても、SQLite3でtimezoneが反映されない時の対処

PHPのプロジェクトで、SQLite3を使っていた時に、php.iniをいじっても、localtimeがUTFになってしまい困っていたところ、、、、原因はDockerコンテナのベースOSに使ったAlpine Linuxのtimezone設定がされてないことでした!

現象

Alpine LinuxベースのPHPコンテナでの話。

SQLite3(phpliteadminなど)で、

DATETIME('now','localtime')

としても、どうしてもUTC時間でDBに書き込まれてしまう現象に遭遇。

php.iniのtimezoneは設定してあって、コンテナ内でphp -r “echo phpinfo();”としても、きちんとAsia/Tokyoで読み込まれている模様。

対策

いろいろ試した結果、SQLite3はphp側の設定ではなく、OS上のtimezone設定を見ているようで(考えてみたら当たり前か。。。)、OSの設定を変えてあげればOKでした。

その1 docker-composeでローカルのlocaltimeをリンクさせる

一番手軽なのが、この方法。

docker-compose.ymlのvolumesに下記を追記します。

volumes:
  - /etc/localtime:/etc/localtime:ro

手軽なのでこの方法で統一するのが一番なのですが、ホストがLinux系の時にしかできないのがデメリット。(Docker for Macだとエラーになりました。。。)

ホストがLinux系じゃない環境でも使い回しをしたい場合は、その2の方法で。

その2 Dockerビルドする時にローカルタイムをイメージに書き込み

Alpine LinuxベースのDockerイメージをビルドする時に、下記のコマンドを追記してローカルタイムを設定しまう方法です。

グローバルでサービスを展開されている方はこの方法ではキツイですが、ローカルだったり日本のみの場合はこちらでもいいと思います。

RUN apk --update add tzdata && \
    cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
    apk del tzdata

以上、SQLite3でlocaltimeがUTCになってしまった原因は、コンテナOSのtimezone設定だった!というお話でした。

と、気づけば本稿が2018年一発目の投稿でした。(もう1月も下旬ですが)

調べたこと、試したことをまとめていくベースですが、少しでも記事やプログラムの質を上げれればと思っておりますので、本年もどうぞよろしくお願いいたします。