サーバーのタイムゾーン設定ではまった話

最近、既存のRailsアプリをカスタマイズして別のインフラに載せ替えるという仕事をしているが、そこでインフラ初心者には解決が困難なタイムゾーン関連の問題が発生した。

なぜか想定より9時間ずれる

APIのレスポンスでdatetime型のカラムのデータが想定より9時間遅れて返ってきた。9時間といえばUTCJSTの時差に一致するので、どこかでタイムゾーンがおかしくなっていることはピンと来た。

コンソールで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/TokyoUTCから何時間の時差があるかわからないので、指定の意味が無かったというオチだった。

最低限のイメージをベースにサーバーイメージを構築していく場合は、色々と入っていると思ったものが入っていないので注意していきたい。