🐳

【prisma ✕ Docker】MySQLコンテナで日本語を使用する方法

2024/03/13に公開

はじめに

今回は、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つも環境変数化しておきます。

.env
 DATABASE_URL="mysql://root:my_password@localhost:3306/my_database"
+ MYSQL_ROOT_PASSWORD=my_password
+ MYSQL_DATABASE=my_database

以下が、作成したdocker-compose.ymlです。

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を指定します。
https://zenn.dev/tttol/scraps/05a27edf4fc62c

あとは環境変数の値を設定するなどしてコンテナ定義をしていきます。

続いてDockerfilemy.cnfというファイルを作成します。

Dockerfile・my.cnf

それぞれ簡単に説明すると、DockerfileはDockerイメージをbuildするためのレシピを記述するファイルです。より具体的に言うと、DockerfileでDockerイメージに必要なパッケージや環境変数の設定などをしてDockerイメージの環境構築を行います。

そして、my.cnfではMySQLデータベースサーバーの設定を行います。
具体的には文字セットの設定やパフォーマンスに関する設定、接続の設定などを記述します。
今回の場合は、文字セットの設定を行います。

ということで実際の実装です。
Dockerfileは以下のようにします。

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ですが、以下のような設定をしています。

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コンテナを作成・実行します。

fish
docker-compose up -d --build

コマンドが成功したら、prisma migrateをし、テーブルを作成します。

fish
npx prisma migrate dev --name init

このコマンドが成功したら、Docker内のMySQLにテーブルが作成されているはずです。
それでは、確認してみましょう。

fish
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 = '太郎';
// 上記のように日本語入力ができれていれば成功です
// ※ 通常は日本語入力できず''となります

参考文献

https://qiita.com/shin0909/items/3193fd96f90f2b5f758c
https://zenn.dev/tttol/scraps/05a27edf4fc62c

Discussion