LoginSignup
2
2

More than 1 year has passed since last update.

Laravel sail の文字化け問題を解消する

Posted at

Laravel sailを普通にビルドすると、データベースの文字化けが発生します。
ここでは解消方法を共有したいと思いますが、その前にDockerの仕組みについて簡単に説明します。

Dockerは、素になるイメージファイルを使ってコンテナイメージを生成します。Dockerのライフサイクルでは一度、イメージが生成されると変更差分をキャッシュするので、一度ビルドすれば何度でもイメージを使いまわすことが可能ですが、基本的に個々のファイルの依存関係をスナップとして保存しているため、アプリケーションのソースコードやデータベースのデータはローカルのディレクトリにマウント(同期)して保管しておく必要があります。

その意味ではGitに似ています。

docker_lifecycle.png

また通常、アプリを稼働・運営する場合は複数のコンテナを生成する必要がありますが、それらの依存関係を定義するファイルがdocker-compose.ymlになります。

まずMySQLのコンテナ内部に入り、データベースの設定ファイルである my.cnf がどこにあるのか、ディレクトリを特定します。Macでは通常、etc/の配下にあるケースが多いです。

スクリーンショット 2022-05-04 17.10.15.png

編集を加えるファイルの場所が分かったので、次にdocker-compose.ymlのファイルにマウントを指示する記述を加え、さらにmy.cnfの中身も編集します。

docker-compose.yml
    mysql:
        image: 'mysql/mysql-server:8.0'
        ports:
            - '${FORWARD_DB_PORT:-3306}:3306'
        environment:
            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ROOT_HOST: "%"
            MYSQL_DATABASE: '${DB_DATABASE}'
            MYSQL_USER: '${DB_USERNAME}'
            MYSQL_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ALLOW_EMPTY_PASSWORD: 1
        volumes:
            - 'sail-mysql:/var/lib/mysql'
            - './my.cnf:/etc/my.cnf'
my.cnf
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
explicit-defaults-for-timestamp=1
general-log=1
general-log-file=/var/log/mysql/mysqld.log

[client]
default-character-set=utf8mb4

これでコンテナを再起動すれば、諸々の変更内容がデータベースに反映されるはずです。

2
2
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
2
2