プログラミング技術

本サイトはプロモーションが含まれています。

【Docker x Ruby on Rails】timezoneを日本時間に設定する

DockerxRailsでtimezone設定
初心者さん
Docker x Ruby on Railsを使っていて、データを登録・更新しても日本時間にならない。どうしよう?

今回は、時間の設定でハマりやすい点について解説していきます。

僕自身、久々に環境構築すると忘れるため備忘録として残しておきます。

▼この記事では、以下の点を理解できます。

  1. Mysqlの設定の確認
  2. Ruby on Railsの設定の確認
  3. timezoneを日本時間にする方法

この後、上記の順で紹介していきたいと思います。timezoneが日本時間にならないという方は確認してみてください。

Mysqlに登録したデータの時間が日本時間にならない原因

Railsアプリでデータを登録したときに、9時間ずれている問題はだいたい以下の2箇所のどちらかが原因なので、調べて修正すると日本時間になると思います。

  • Mysqlの設定
  • Railsの設定

順番に確認していきたいと思います。

実行環境

▼このような環境で変更、確認をしています。

  • macOS Big Sur(11.6)
  • Docker version 20.10.7
  • mysql8.0
  • rails6系

DockerのMysqlのtimezoneを確認設定する

DockerのMysqlを利用する場合に、どのような設定になっているのか確認してみます。

Mysqlにログインして設定を確認する

Mysqlの設定を確認するために、Dockerに入り、Mysqlにログインして確認していくため、以下の手順で進めていきます。

Dockerでコンテナ名を確認する

docker-compose psコマンドでコンテナ一覧を表示し、mysqlのコンテナ名を利用ます。(僕の環境では、backend_db_1です。)

docker-compose ps

Name
-------------------------------------------------
backend_api_1 ...
backend_db_1 ...

Dockerに入る

最初に以下のコマンドでdockerに入ります。「root@8e31...」みたいになっていると思います。

※当然ですが、docker-compose upで起動しておく必要があります。

docker exec -it backend_db_1 bash

Mysqlにログインする

次にMysqlにログインしていきます。Mysqlのログイン情報はconfig/database.ymlに書いてあると思います。

mysql -u root -p
Enter password: ← ここにパスワードをセットしてEnter

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection...
...
...

mysql>

Mysqlの設定を確認する

このようになっているとしっかり設定されているので、問題ないですね。

mysql>show variables like '%time_zone%';
+------------------+------------+
| Variable_name    | Value      |
+------------------+------------+
| system_time_zone | JST        |
| time_zone        | Asia/Tokyo |
+------------------+------------+

試しにInset文を書いて実行してみて、現在時刻でInsertされているのであれば問題なしです。

mysql>Insert into myapp_development.sample_table
(name, created_at, updated_at)
values('サンプルレコード', NOW(), NOW());

Docker x Mysqlの設定を変える方法

設定確認するコマンドをたたいて、以下のような設定になっている場合は、timezoneをAsia/Tokyoにすることで解決します。

mysql>show variables like '%time_zone%';
+------------------+------------+
| Variable_name    | Value      |
+------------------+------------+
| system_time_zone | UTC        |
| time_zone        | SYSTEM |
+------------------+------------+

timezoneをAsia/Tokyoにする

timezoneの設定は、docker-compose.ymlでできます。以下はサンプルのdocker-compose.ymlです。「command」の部分で設定しています。

version: "3"
services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password
    command: --default-time-zone=Asia/Tokyo --default-authentication-plugin=mysql_native_password
    volumes:
      - mysql-data:/var/lib/mysql
      - /tmp/dockerdir:/etc/mysql/conf.d/
    ports:
      - 3306:3306

これでMysqlのtimezoneがAsia/Tokyoに変更されていると思うので、確認してみてください。

インサート文が現在時刻で登録・更新できることが確認できたけれど、Railsアプリから登録すると9時間ずれているという場合は、さらにRails側で設定が必要なので、次に進んでみてください。

Ruby on Railsの設定の確認・変更する

以下のような場合はRails側の設定に問題がありそうです。

  • SQL文を書いてインサートした場合に現在時刻で登録される
  • Railsアプリから登録すると時間がずれる

Dockerのコンソールに入る

次はRails側のコンテナ名(backend_api_1)で入る。

docker exec -it backend_api_1 bash

rails c

irb(main):001:0>

Railsから登録

nameのみを持ったテーブルに、以下のような感じでRailsコンソールから登録してみる。その結果を確認してみてください。

irb(main):001:0>sample = Sample.new()
irb(main):001:0>sample.name = 'Railsから登録'
irb(main):001:0>sample.created_at = Time.now
irb(main):001:0>sample.updated_at = Time.now

irb(main):001:0>sample.save!

Railsから登録して時間がずれていた場合に追記する

Railsのconfig/application.rbの設定を確認する

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

timezoneの修正

config.active_record.default_timezoneはDB書き込みの際にどちらの設定を優先するかの設定になります。

以下のようになっていると、Insertしたときに、時間のずれがなくなっていると思います。

irb(main):001:0>Time.zone

#<ActiveSupport::TimeZone:0x000055de3090a358 @name="Tokyo", @tzinfo=#<TZInfo::DataTimezone: Asia/Tokyo>, @utc_offset=nil>

【Docker x Ruby on Rails】timezoneを日本時間に設定まとめ

今回は、Docker x Railsでtimezoneの設定が漏れていて登録時間がずれてしまう点についての備忘録になります。

Dockerに入ってから設定の確認する方法や設定の変更などで詰まった人の参考になると幸いです。

-プログラミング技術