MySQLで日本語を使用可能にする最低限のDockerfile

# はじめに
Dockerで単純にMySQLのイメージを使ってコンテナを立ち上げると、日本語入力ができません。日本語対応にするために必要なDockerfileの記述を検討します。

# 結論
Dockerコンテナのロケールを日本語に設定します。
ロケールを設定していれば、MySQLの文字コードにも反映されます。

# 日本語が使えない状態について
```Dockerfile:Dockerfile
FROM mysql:8.0-debian
```
上記のDockerfileでDockerイメージを作成します。

```Terminal:ターミナル
docker exec -it コンテナ名 bash
```
docker execコマンドでコンテナの中に入り、コンテナ内のターミナルで日本語を入力してみると、Enterで確定しようとすると入力した文字が消えてしまいます。
MySQLでも同様で、ログイン、データベースの作成、テーブルの作成などを行い、日本語でレコードを挿入しようとすると、ターミナルで日本語が入力できません。

![スクリーンショット 2023-02-06 13.13.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/925094/9a5082d8-a9f1-58c0-b39a-eb9d034926fb.png)
Enterを押すと、入力した文字が消えます。

# 原因
Dockerコンテナのロケールが日本語に設定されていないため、日本語の入力ができなくなっています。
何も設定を変更していない場合のロケールに関しては、[日本語が使えるようにDockerfileでロケール関連の設定をする - Qiita](https://qiita.com/yuri_t/items/a927744770d0be9f7aca)にてまとめています。

# 解決策
Dockerコンテナのロケールの設定を行います。
- コンテナにロケールをインストールする
- ロケールの設定を行う

上記2つを行うことでコンテナ内で日本語が使用でき、MySQLの設定も変更されます。
## Dockerfileの内容
以下の様に、ロケールのインストールとロケールの設定を行います。
```Dockerfile:Dockerfile
FROM mysql:8.0-debian

RUN apt-get update
RUN apt-get install locales-all

ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8

```
## イメージ

```Dockerfile:Dockerfile
FROM mysql:8.0-debian
```
ベースとなるイメージです。
単なる「mysql:8.0」だとコンテナがLinuxのRed Hatになり、apt-getが使えないので、apt-getの使えるDebianのものにします。
（Red Hatの場合yumを使うようですが、Dockerfileでもできるかは未確認です）

## ロケールのインストール

```Dockerfile:Dockerfile
RUN apt-get update
RUN apt-get -y install locales-all
```
RUNはビルド時に実行するコマンドです。
apt-getはLinuxのコマンドで、パッケージの操作・管理をします。
apt-get updateでパッケージの一覧を更新します。
apt-get installでパッケージをインストールします。
-yオプションは、インストール途中の問い合わせを全て「y(yes)」と答える、というものです。
もしこのyオプションをつけていないと、yと答えられず下記の様にエラーで終わるので、必ず付けます。
```terminal:ターミナル
★★#5 1.147 Do you want to continue? [Y/n] Abort.
------
executor failed running [/bin/sh -c apt-get install locales-all]: exit code: 1
```
この「locales-all」でインストールすると、日本語以外のロケールも全てインストールされます。いくつかの記事で見つけた「language-pack-ja」でも試してみたのですが、できないようなので全てインストールしてしまいます。

## 環境変数の設定
```Dockerfile:Dockerfile
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
```
ロケールを環境変数に設定します。LANGのみを設定するだけで日本語入力に問題はなさそうでしたが、ロケールの中で設定されていないのはこの３つなので、とりあえず全て設定します。LANGUAGEのみ記述が異なるので注意してください。

# ロケール未設定と設定済みのMySQLの文字コードの違い

ロケールを日本語に設定することで、MySQLでの文字コードが変更されます。
以下はMySQLにログインした後のコマンド及び結果になります。

## character_set_server等
MySQLの文字コードを確認するのに、「character」と名のつく変数を表示させます。
```Terminal:MySQL
SHOW VARIABLES LIKE "chara%";
```

| Variable_name  | Value(未設定) | Value(設定済み） |
|---|---|---|
|  character_set_client  | latin1   |utf8mb4   |
|  character_set_connection |  latin1  |utf8mb4  |
|  character_set_database | utf8mb4  |utf8mb4  |
|  character_set_filesystem |  binary | binary |
|  character_set_results |  latin1  |utf8mb4  |
|  character_set_server |  utf8mb4 |utf8mb4  |
|  character_set_system |  utf8mb3 |utf8mb3 |
|  character_sets_dir  |  /usr/share/mysql-8.0/charsets/ | /usr/share/mysql-8.0/charsets/ |

未設定だとlatin1とutf8mb4、utf8mb3が入り乱れていますが、ロケールの設定をするとlatin1がutf8mb4になりました。

# MySQL側の設定が必要なのかどうか
「Docker」「MySQL」「日本語」で検索して出てくる記事のほとんどに、my.cnfなどのMySQLの設定ファイルを作成して適用させる、という手順が出てきます。
私も真似をして設定するつもりだったのですが、ロケールの設定が終わった段階で、MySQL側には何もしないで、今の所、特に問題なく日本語が使えています。
なので暫定的な結論として、<font color="red">ロケールを設定すれば、MySQL側の設定は不要</font>としておきます。
何か問題が出てきたら追記します。


# 参考
- [DockerのMySQLコンテナを日本語対応させる - Qiita](https://qiita.com/zongxiaojie/items/6b593ec4ce5e85bb342c)