patorashのブログ

方向性はまだない

コンテナのTimezoneは統一しよう

Railsアプリの開発中に、ちょっと物によっては時間がかかる処理があったので、ActiveJobに処理を移行させたのですが、perform_nowperform_laterでデータを保存した時のcreated_at等が9時間ずれる現象が発生しました。

結論から書くと…

結論は、rails serverしているコンテナのTimezoneは'Asia/Tokyo'になっていたのですが、ActiveJobを処理するresqueを動かしているコンテナのTimezoneが未設定でした。

未設定だと、UTCになるのですが、Railsアプリケーション的には

config.active_record.default_timezone = :local
config.time_zone = 'Tokyo'

となっていたので、Time.zone.nowなどをActiveJobで行ってもずれていることもなく…。データ保存後に再取得してcreated_atを表示しても正しい値を出しているのに、rails sをしているコンテナ側からアクセスすると時間が9時間前になっているという状況で本当に参りました。

対処

docker-compose.ymlのresqueのところの環境変数TZに値を設定しました。

services:
  # 略
  rails:
    # 略
    environment:
      TZ: "/usr/share/zoneinfo/Asia/Tokyo"
      # 略

  resque:
    # 略
    environment:
      TZ: "/usr/share/zoneinfo/Asia/Tokyo"
      # 略