1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

はじめに

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

結論

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

日本語が使えない状態について

Dockerfile
FROM mysql:8.0-debian

上記のDockerfileでDockerイメージを作成します。

ターミナル
docker exec -it コンテナ名 bash

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

スクリーンショット 2023-02-06 13.13.16.png
Enterを押すと、入力した文字が消えます。

原因

Dockerコンテナのロケールが日本語に設定されていないため、日本語の入力ができなくなっています。
何も設定を変更していない場合のロケールに関しては、日本語が使えるようにDockerfileでロケール関連の設定をする - Qiitaにてまとめています。

解決策

Dockerコンテナのロケールの設定を行います。

  • コンテナにロケールをインストールする
  • ロケールの設定を行う

上記2つを行うことでコンテナ内で日本語が使用でき、MySQLの設定も変更されます。

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
FROM mysql:8.0-debian

ベースとなるイメージです。
単なる「mysql:8.0」だとコンテナがLinuxのRed Hatになり、apt-getが使えないので、apt-getの使えるDebianのものにします。
(Red Hatの場合yumを使うようですが、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と答えられず下記の様にエラーで終わるので、必ず付けます。

ターミナル
★★#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
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」と名のつく変数を表示させます。

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側には何もしないで、今の所、特に問題なく日本語が使えています。
なので暫定的な結論として、ロケールを設定すれば、MySQL側の設定は不要としておきます。
何か問題が出てきたら追記します。

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?