Laravel sailを普通にビルドすると、データベースの文字化けが発生します。
ここでは解消方法を共有したいと思いますが、その前にDockerの仕組みについて簡単に説明します。
Dockerは、素になるイメージファイルを使ってコンテナイメージを生成します。Dockerのライフサイクルでは一度、イメージが生成されると変更差分をキャッシュするので、一度ビルドすれば何度でもイメージを使いまわすことが可能ですが、基本的に個々のファイルの依存関係をスナップとして保存しているため、アプリケーションのソースコードやデータベースのデータはローカルのディレクトリにマウント(同期)して保管しておく必要があります。
その意味ではGitに似ています。
また通常、アプリを稼働・運営する場合は複数のコンテナを生成する必要がありますが、それらの依存関係を定義するファイルがdocker-compose.ymlになります。
まずMySQLのコンテナ内部に入り、データベースの設定ファイルである my.cnf がどこにあるのか、ディレクトリを特定します。Macでは通常、etc/の配下にあるケースが多いです。
編集を加えるファイルの場所が分かったので、次にdocker-compose.ymlのファイルにマウントを指示する記述を加え、さらにmy.cnfの中身も編集します。
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'
[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
これでコンテナを再起動すれば、諸々の変更内容がデータベースに反映されるはずです。