1
0

dockerを使ったrails環境でのletter_opnerのtimezoneの設定

Last updated at Posted at 2024-06-24

letter_opner でテスト送信をした際に

letter_opner でテスト送信をした際に送られてくるメールの
送信日時が UTC(協定世界時)でした。

早速プロジェクトの imtezone を日本時間に設定する

config/application.rb

config.time_zone = 'Tokyo'
#Railsアプリケーション内部でのデフォルトのタイムゾーンを設定
config.i18n.default_locale = :ja
#Railsはデータベースに保存される時刻を日本時間で保存

としてコンソールで確認すると
きちんと日本時間になっています。

Time.now  #出力結果 =>2024-05-22 14:16:09.609170085 +0900

再度 letter_opner でテスト送信をしてみると
なぜか送信時間は UTC のままです。
Docker コンテナのタイムゾーンを確認して見ます。

docker-compose exec web date #出力結果=>Thu Jun 20 00:51:34 UTC 2024

"docker コンテナのシステムタイムゾーンが UTC に設定されてしまっている”

Docker コンテナのタイムゾーン設定と letter_opener でのメール表示における問題の解決

Docker を使用してアプリケーションを開発していると、コンテナ内のシステムタイムゾーンがデフォルトで UTC(協定世界時)に設定されていることがあります。
これにより、letter_opener などのツールで表示されるメールのタイムスタンプが、日本の標準時(JST、Japan Standard Time、Tokyo タイムゾーン)とは異なることがあります。

タイムゾーンの設定を Tokyo に変更する

Dockerfile でタイムゾーンを設定する

下記のコマンドを dockerfile に追記します


RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
    echo "Asia/Tokyo" > /etc/timezone

補足

下記の方法を最初は試していましたが、docker のシステムタイムゾーンは変わりませんでした。

docker-compose.yml
version: '3'
services:
  web:
    image: myapp_image
    environment:
      - TZ=Asia/Tokyo #追記


letter_opener でのメール時間表示の確認

タイムゾーンの設定を変更したら、letter_opener で表示されるメールのタイムスタンプが日本時間に合わせて表示されるか確認します。
再度コンテナを起動し、メールを送信して letter_opener で確認すると、
タイムスタンプが期待通り JST になりました。

docker-compose up -d --build

まとめ

Docker を使った rails 環境での timezone には、コンテナ内のシステムタイムゾーンと application 内部での timezone(config.time_zone, config.active_record.default_timezone)があることがわかりました。
Docker コンテナ内のタイムゾーンが UTC に設定されていると、letter_opener などのツールでの時間表示がずれてしまうことがあります。この記事では、Dockerfile または docker-compose.yml でタイムゾーンを Asia/Tokyo に変更する方法を紹介しました。

この設定を行うことで、開発中のコンテナ内での時間表示の不一致を解消することができました。

参考記事

Rails のタイムゾーン設定について

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0