サーバーのタイムゾーン設定ではまった話
最近、既存のRailsアプリをカスタマイズして別のインフラに載せ替えるという仕事をしているが、そこでインフラ初心者には解決が困難なタイムゾーン関連の問題が発生した。
なぜか想定より9時間ずれる
APIのレスポンスでdatetime型のカラムのデータが想定より9時間遅れて返ってきた。9時間といえばUTCとJSTの時差に一致するので、どこかでタイムゾーンがおかしくなっていることはピンと来た。
コンソールでDBのデータを確認すると想定通りの時間になっているのでデータの問題ではなさそう。 Railsのタイムゾーンの設定が間違っているかもしれないので調べてみた。
config.time_zone = 'Tokyo' config.active_record.default_timezone = :local
うーん、検索したみたらこの設定で問題なさそう。
そうなるとサーバーの設定があやしそう。ということで
Rails.logger.info "⭐️Time.now: #{Time.now}"
みたいなログを仕込んでみると、案の定2022-11-28 14:43:39.893488 +0000
みたいにUTCになっていた。
TZ=Asia/Tokyoを指定してみる
サーバーのタイムゾーンは、TZ=Asia/Tokyo
のように環境変数TZ
で指定するか、指定がなければ/etc/localtime
の設定が参照されるようだ。
TZ=Asia/Tokyo
の指定がなかったので追加して再度確認したが状況は変わらず。万策尽きた。
原因はDockerイメージの作り方だった
有識者に相談したところ、Dockerfileでtzdata
(タイムゾーンデータ)をインストールする記述がないので、これが原因ではないかということだった。
以下のコードを追加したイメージを作成して動かしたところ無事に解決した。
RUN apt-get update \ && apt-get install -y tzdata
tzdata
がないとTZ=Asia/Tokyo
と指定してもAsia/Tokyo
がUTCから何時間の時差があるかわからないので、指定の意味が無かったというオチだった。
最低限のイメージをベースにサーバーイメージを構築していく場合は、色々と入っていると思ったものが入っていないので注意していきたい。