🐕

docker compose で MySQL を動かすときのタイムゾーン指定方法

2023/03/05に公開

まえがき

  • 個人開発で SELECT NOW() したときに、UTC の日付時刻が返ってきたため修正する!

環境

  • WSL2 (Windows 10 64bit)
    • Ubuntu 22.04.2 LTS
      • docker compose
        • MySQL 8.0.32

手順

docker-compose.yaml を編集

  • 現状はこんな感じ
version: '3.9'
services:
  mysql:
    build: ./mysql
    volumes:
      - ./mysql/data:/var/lib/mysql
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=password

  • ビルド時にタイムゾーンがセットされるように environment と command を追加
version: '3.9'
services:
  mysql:
    build: ./mysql
    volumes:
      - ./mysql/data:/var/lib/mysql
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - TZ=Asia/Tokyo
    command: ['mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_general_ci','--default-time-zone=+09:00']

補足

  • mysqld とは MySQL の処理をつかさどる Daemon(大味解釈)
  • MySQL 8.0.32 における character-set-server と collation-server の初期値は以下
mysql> SELECT @@character_set_server, @@collation_server;
+------------------------+--------------------+
| @@character_set_server | @@collation_server |
+------------------------+--------------------+
| utf8mb4                | utf8mb4_0900_ai_ci |
+------------------------+--------------------+
1 row in set (0.00 sec)

確認

  • docker compose up --build -d して、ビルドできることを確認
  • mysql に入って、now() が日本時間になっていることを確認
mysql> SELECT NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2023-03-05 20:40:54 |
+---------------------+
1 row in set (0.00 sec)
  • 完了!

参考

Discussion