この記事でやりたいこと
Laravel Sail 開発環境で、
- タイムゾーンをJST(日本標準時)に変更する
- MySQLの文字コードをutf8系に変更する
上記2点のカスタマイズを行う。
動作環境
- macOS 13.5.2
- PHP 8.2.11
- Laravel Framework 10.28.0
- Docker version 23.0.5, build bc4487a
詳細
Laravel Sail は、LaravelでDockerコンテナによる開発環境を提供してくれるコマンドラインインターフェースであるが、タイムゾーンとMySQLの文字コードの変更は、開発を始める前にやっておくべきである。
Sailは docker-compose を利用してDockerコンテナを起動し、開発環境を立ち上げている。
Dockerコンテナの設定は Dockerfile に記述されており、この Dockerfile をいじることで開発環境を独自にカスタマイズすることができる。
下準備
まずはターミナルで下記のコマンドを実行して、アプリケーションルートに docker ディレクトリを作成する。
sail artisan sail:publish
(これにより、docker-compose.yml の記述が一部変更され、docker ディレクトリおよびその中の Dockerfile が利用できるようになった。)
ここで、dockerディレクトリを覗いてみると、いくつかの子ディレクトリが存在することが分かる(筆者の場合、8.0、8.1、8.2、8.3 の4つの子ディレクトリがあった)。
このうち実際に使用されるのは1つだけであり、どれが使用されるかは docker-compose.yml の services.laravel.test.build.context
の箇所に記載されている。
services:
laravel.test:
build:
context: ./docker/8.2 # ← ココを見る
dockerfile: Dockerfile
args:
WWWGROUP: '${WWWGROUP}'
image: sail-8.2/app
# 以下略...
筆者の場合、docker/8.2 のディレクトリが使われていることが分かったので、以降はdocker/8.2/Dockerfile を編集していく。
以上で下準備は完了。
本題1: タイムゾーンのカスタマイズ
ようやく本題に入る。
タイムゾーンをJST(日本標準時)に変更 していく。
やることは単純で、Dockerfile内の ENV TZ の箇所を 'Asia/Tokyo' に変えるだけである。
# ENV TZ=UTC コメントアウトまたは削除
# ↓ 追加
ENV TZ='Asia/Tokyo'
変更後はDockerイメージを再ビルドする必要がある(しばらく時間がかかる)。
sail build --no-cache
再ビルド完了後、 sail up -d
コマンドでDockerコンテナを起動してから、下記のコマンドでDockerコンテナにログインして日付を確認してみる。
(sail up -d コマンドを実行してから行うこと)
sail shell
date
すると、例えば Thu Feb 24 00:00:00 JST 2023
のように時刻が表示される。
JST となっていれば無事成功。
本題2: MySQLの文字コードを変更する
2つ目の本題に入る。
MySQLの文字コードが正しいもの設定されていない場合、文字が適切に表示されなくなってしまうので、これもカスタマイズする必要がある。
docker/8.2 ディレクトリ(← 8.2 の部分は適宜自身のものに読み替えること)に my.cnf
ファイルを新規作成し、以下の内容を記述する。
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_bin
[client]
default-character-set = utf8mb4
その後、MySQLの設定ファイルとしてこのファイルをMySQLコンテナの /etc ディレクトリに配置するように docker-compose.yml に追記する。下記のように、mysql
のvolumes
の欄に './docker/8.2/my.cnf:/etc/my.cnf'
を追加する。
services:
laravel.test:
# (中略)
mysql:
image: 'mysql/mysql-server:8.0'
ports:
- '${FORWARD_DB_PORT:-3306}:3306'
environment:
# (中略)
volumes:
- 'sail-mysql:/var/lib/mysql'
- './docker/mysql/create-testing-database.sh:/docker-entrypoint-initdb.d/10-create-testing-database.sh'
- './docker/8.2/my.cnf:/etc/my.cnf' # この1行を追加!!!!!!!
networks:
- sail
# 以下略...
完了したら、sail down
コマンドで一度コンテナを停止させ、再度sail up -d
で起動してから、下記のコマンドで文字コードを確認してみる。
sail mysql
mysql > show variables like '%char%';
以上です。
参考