Debianベースのコンテナで日本語入力ができなかった時の話


概要

DockerやPHPの勉強にと作成したLaravelプロジェクトにて、
MySQLをコマンドラインで操作しようとした際に日本語を入力できなかったので入力できるようにしました。

事象

テストデータを入れようとした時のこと、
テストデータ作成にちょうど良さそうなスプレッドシートがあったのでそのセルをコピーし
MySQLを起動しペーストしてみたところ、日本語部分のみ消えてしまいました。

(イメージ)

ペースト!(この時すでに日本語が消えている)
mysql> Insert into hoge (title, created_at, updated_at) values ('hoge', NOW(), NOW());

mysql> select * from hoge;
+-----+-----------------+---------------------+---------------------+
| id  | title           | created_at          | updated_at          |
+-----+-----------------+---------------------+---------------------+
| 1   | hoge            | 2019-07-06 05:51:22 | 2019-07-06 05:51:22 |
+-----+-----------------+---------------------+---------------------+
1 row in set (0.00 sec)

対応

MySQL内については、ちゃんと文字コード指定してあるし
Googleログイン機能を導入した際に(https://qiita.com/enuswi/items/0a24b09ed6e961c3beab)
日本語が登録されることは確認済みでしたので少し困惑したのですが、
調べてみるとどうやらDebian側で設定が必要とのことでしたので
Dockerfileを書き換えてみました。

フォルダ構成

.
├── mysql
│   ├── Dockerfile
│   ├── my.cnf
│   └── etc
│       └── locale.gen (新規に追加)
├── nginx
│   └── default.conf
├── php
│   └── Dockerfile
├── docker-compose.yml
└── src (laravel project)

Dockerfileの追加項目
* vim、locales、locales-allパッケージの追加
* 「ja_JP.UTF-8 UTF-8」の行のみ有効にしたlocale.genをetc以下に配置
* ロケールの生成・設定の更新

FROM mysql:5.7

# 追加ここから
RUN apt-get update \
    && apt-get install -y \
    vim \
    locales \
    locales-all

ADD ./etc/locale.gen /etc/locale.gen

RUN locale-gen \
    update-locale
# 追加ここまで

ADD ./my.cnf /etc/mysql/conf.d/my.cnf

CMD ["mysqld"]

locale.gen
# (略)
# iu_CA UTF-8
# ja_JP.EUC-JP EUC-JP
ja_JP.UTF-8 UTF-8
# ka_GE GEORGIAN-PS
# ka_GE.UTF-8 UTF-8
# (略)

以上修正したら、
ビルドし直してコンテナに入り直すとコマンドラインで日本語が使えるようになりました。
元々の状態だとMySQLに限らずコンテナ自体で日本語が使えてなかったのですが上記の修正にて使用できるようになりました。

ペースト!
mysql> Insert into hoge (title, created_at, updated_at) values ('hogeについて', NOW(), NOW());

mysql> select * from hoge;
+-----+-----------------+---------------------+---------------------+
| id  | title           | created_at          | updated_at          |
+-----+-----------------+---------------------+---------------------+
| 1   | hogeについて      | 2019-07-06 05:51:22 | 2019-07-06 05:51:22 |
+-----+-----------------+---------------------+---------------------+
1 row in set (0.00 sec)

最後に

今回は、mysql用のコンテナで対応しましたが、
本来は作業用のコンテナを作ってそこで対応するべきなんだろうなと思います。
(laradocのworkspaceコンテナみたいな)

参考