はじめに
Dockerで単純にMySQLのイメージを使ってコンテナを立ち上げると、日本語入力ができません。日本語対応にするために必要なDockerfileの記述を検討します。
結論
Dockerコンテナのロケールを日本語に設定します。
ロケールを設定していれば、MySQLの文字コードにも反映されます。
日本語が使えない状態について
FROM mysql:8.0-debian
上記のDockerfileでDockerイメージを作成します。
docker exec -it コンテナ名 bash
docker execコマンドでコンテナの中に入り、コンテナ内のターミナルで日本語を入力してみると、Enterで確定しようとすると入力した文字が消えてしまいます。
MySQLでも同様で、ログイン、データベースの作成、テーブルの作成などを行い、日本語でレコードを挿入しようとすると、ターミナルで日本語が入力できません。
原因
Dockerコンテナのロケールが日本語に設定されていないため、日本語の入力ができなくなっています。
何も設定を変更していない場合のロケールに関しては、日本語が使えるようにDockerfileでロケール関連の設定をする - Qiitaにてまとめています。
解決策
Dockerコンテナのロケールの設定を行います。
- コンテナにロケールをインストールする
- ロケールの設定を行う
上記2つを行うことでコンテナ内で日本語が使用でき、MySQLの設定も変更されます。
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
イメージ
FROM mysql:8.0-debian
ベースとなるイメージです。
単なる「mysql:8.0」だとコンテナがLinuxのRed Hatになり、apt-getが使えないので、apt-getの使えるDebianのものにします。
(Red Hatの場合yumを使うようですが、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と答えられず下記の様にエラーで終わるので、必ず付けます。
★★#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」でも試してみたのですが、できないようなので全てインストールしてしまいます。
環境変数の設定
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ロケールを環境変数に設定します。LANGのみを設定するだけで日本語入力に問題はなさそうでしたが、ロケールの中で設定されていないのはこの3つなので、とりあえず全て設定します。LANGUAGEのみ記述が異なるので注意してください。
ロケール未設定と設定済みのMySQLの文字コードの違い
ロケールを日本語に設定することで、MySQLでの文字コードが変更されます。
以下はMySQLにログインした後のコマンド及び結果になります。
character_set_server等
MySQLの文字コードを確認するのに、「character」と名のつく変数を表示させます。
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側には何もしないで、今の所、特に問題なく日本語が使えています。
なので暫定的な結論として、ロケールを設定すれば、MySQL側の設定は不要としておきます。
何か問題が出てきたら追記します。