3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Laravel Sail 開発環境のカスタマイズ

Last updated at Posted at 2023-10-11

この記事でやりたいこと

Laravel Sail 開発環境で、

  1. タイムゾーンをJST(日本標準時)に変更する
  2. 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の箇所に記載されている。

docker-compose.yml
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' に変えるだけである。

docker/8.2/Dockerfile
# 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 ファイルを新規作成し、以下の内容を記述する。

docker/8.2/my.cnf
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_bin

[client]
default-character-set = utf8mb4

その後、MySQLの設定ファイルとしてこのファイルをMySQLコンテナの /etc ディレクトリに配置するように docker-compose.yml に追記する。下記のように、mysqlvolumesの欄に './docker/8.2/my.cnf:/etc/my.cnf' を追加する。

docker-compose.yml
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%';

画像のように、Value欄がutf8系になっていればOK!
スクリーンショット 2023-10-12 0.31.54.png

以上です。


参考

3
1
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
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?