【prisma ✕ Docker】MySQLコンテナで日本語を使用する方法
はじめに
今回は、prismaとDockerを用いてMySQLでデータベースの構築をしたのですが、その際、MySQL上で日本語入力したいと思ったのですが、それなりに時間がかかったため、その方法を備忘録的に残そうと思い、記事にいたします。
前提
- prisma導入済み(
npm install --save-dev prisma
実行済み) - schema.primsa作成済み(
npx prisma init
実行済み)
実装
それでは以下の順に見ていきましょう。
- docker-compose.yml
- Dockerfile・my.cnf
- mysqlログイン・日本語入力確認
docker-compose.yml
まずはdocker-compose.yml
の実装です。
初心者の方に言うと、このファイルでは、Docker Composeを使用してコンテナを定義・実行します。
いわばコンテナの設定ファイルです。
そして今回はprismaを使用するので環境変数として、DATABASE_URLが設定されていると思います。
それ以外に、docker-compose.yml
でもデータベースパスワードとデータベース名を使用するため、この2つも環境変数化しておきます。
DATABASE_URL="mysql://root:my_password@localhost:3306/my_database"
+ MYSQL_ROOT_PASSWORD=my_password
+ MYSQL_DATABASE=my_database
以下が、作成したdocker-compose.yml
です。
version: '3'
services:
mysql:
build: .
platform: linux/amd64
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
今回、Dockerfile
からDockerイメージをbuildしたいので、build: .
として、Dockerファイルが存在するパスを指定します。
また、Appleシリコンを使用していると、DockerファイルからMySQLのDockerイメージをpullできない(エラーとなる)ため、platform: linux/adm64
を指定します。
あとは環境変数の値を設定するなどしてコンテナ定義をしていきます。
続いてDockerfile
とmy.cnf
というファイルを作成します。
Dockerfile・my.cnf
それぞれ簡単に説明すると、DockerfileはDockerイメージをbuildするためのレシピを記述するファイルです。より具体的に言うと、DockerfileでDockerイメージに必要なパッケージや環境変数の設定などをしてDockerイメージの環境構築を行います。
そして、my.cnfではMySQLデータベースサーバーの設定を行います。
具体的には文字セットの設定やパフォーマンスに関する設定、接続の設定などを記述します。
今回の場合は、文字セットの設定を行います。
ということで実際の実装です。
Dockerfileは以下のようにします。
FROM mysql:8.0-debian
COPY my.cnf /etc/mysql/conf.d/my.cnf
RUN apt-get update && apt-get install -y locales \
&& sed -i -e 's/# \(ja_JP.UTF-8\)/\1/' /etc/locale.gen \
&& locale-gen \
&& update-locale LANG=ja_JP.UTF-8
ENV LC_ALL ja_JP.UTF-8
ENV TZ Asia/Tokyo
ENV LANG=ja_JP.UTF-8
EXPOSE 3306
ここでの注目点はDockerイメージにmysql:8.0-debian
を使用している点です。
debianでないとapt-get
コマンドを使用できないため、こちらのイメージをbuildするようにしています。
また、RUN
の部分で日本語入力できるようライブラリを導入しています。
続いてmy.cnf
ですが、以下のような設定をしています。
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
[client]
default-character-set=utf8mb4
mysqld
セクションではcharacter-set-server=utf8mb4
とすることでMySQLサーバーのデフォルト文字セットをutf8mb4
に設定しています。
また、collation-server=utf8mb4_unicode_ci
とすることでMySQLサーバーのデフォルトの照合順序をutf8mb4_unicode_ci
に設定します。
これにより大文字・小文字を区別せず、Unicode標準に従って文字列の比較を行うことができます。
またclient
セクションでは、default-character-set=utf8mb4
とすることでMySQLクライアントのデフォルト文字セットをutf8mb4
に設定します。これによりサーバーへの接続時に使用される文字列がutf8mb4
となります。
これでMySQL環境構築の準備は整いました。
次にコマンドを押して環境構築しつつ、日本語入力できるかを確認していきましょう。
MySQL環境の構築
まず、以下のコマンドでDockerコンテナを作成・実行します。
docker-compose up -d --build
コマンドが成功したら、prisma migrate
をし、テーブルを作成します。
npx prisma migrate dev --name init
このコマンドが成功したら、Docker内のMySQLにテーブルが作成されているはずです。
それでは、確認してみましょう。
docker ps
docker exec -it <Container ID> bash
mysql -u root -p
// パスワード入力が求められるのでパスワードを入力し、mysqlにログインします
show databases;
// 該当のDBを使用します
use my_database;
show tables;
// テーブル一覧が表示されていれば成功です
select * from User where name = '太郎';
// 上記のように日本語入力ができれていれば成功です
// ※ 通常は日本語入力できず''となります
参考文献
Discussion