はじめに
CLI で日本語を打とうとしたら、できませんでした。全角で日本語を打てるのですけれども、変換、確定するときに消えてしまいました。 vim をインストールし、そこで日本語を入力してみようとしてみましたが、やはりダメでした。別の文字へと変換されてしまったのです。例えば "あいう" => "~A~B~A~D~A~F" となってしまいました。
結論
- コンテナ内の CLI ではやはり日本語を使用できていない。
- コンテナ内の次の環境での結果
- PHP の REPL (
php -a
): 日本語を使用できた。 - MySQL クライアント (
mysql -u root -p ...
): 日本語を使用できた。 - Vim: 日本語を使用できた。
- PHP の REPL (
Debian
apt-get update && apt-get install -y locales
sed -i -E 's/# (ja_JP.UTF-8)/\1/' /etc/locale.gen
locale-gen
export LANG=ja_JP.UTF-8
MySQL や PHP など debian:buster-slim ベースのイメージの Dockerfile に書く場合
RUN apt-get update && apt-get install -y \
locales \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
RUN sed -i -E 's/# (ja_JP.UTF-8)/\1/' /etc/locale.gen \
&& locale-gen
ENV LANG ja_JP.UTF-8
いろいろ検索して書き散らしたコード。あまり良く無い
一応次のコマンドで問題は解決できました。けれども、さらに調べてみると、無駄が多いことがわかりました。
apt-get update && apt-get install -y locales
echo "ja_JP.UTF-8 UTF-8" > /etc/locale.gen
locale-gen ja_JP.UTF-8
export DEBIAN_FRONTEND noninteractive
dpkg-reconfigure locales
update-locale LANG=ja_JP.UTF-8
export LANG ja_JP.UTF-8
参考
- Dockerではコンテナのlocaleの再確認を – Qiita
- Debian/Ubuntuのロケールを日本語にする方法 – Qiita
- Docker debian系のlocaleを日本語化する – Qiita
いろいろ検索して学んだこと
/etc/locale.gen
ファイルはapt install locales
後に生成される。最初からあるわけではない。 予めecho "ja_JP.UTF-8 UTF-8" > /etc/locale.gen
などとして/etc/locale.gen
ファイルを生成しておくと、apt install locales
後にこのファイルは生成されない。export DEBIAN_FRONTEND noninteractive
は入力待ちでブロックしなくなる設定。dpkg-reconfigure locales
は実行後、ユーザーの入力を待つため。入力を待たないため、このdpkg-reconfigure locales
の実行内容はただの locales 設定のリセットになる。dpkg-reconfigure locales
を実行すると、/etc/locale.gen
ファイルがリセットされた。おそらく、オプションなしで実行するためだと思う。update-locale LANG=ja_JP.UTF-8
すると、/etc/default/locale
が編集されLANG=ja_JP.UTF-8
が追記された。デフォルトのロケールを定めたい場合は使うと良さそう。dpkg-reconfigure
はインストール済みパッケージを再設定するものであり、ロケールに特化したものではない。これを使って対話的に設定したいことが無いのならば、このコマンドを使う必要は無い。export LANG=ja_JP.UTF-8
すると、 CLI で日本語を入力することはできなかったが、 PHP の REPL (php -a
) では入力することができた。echo "ja_JP.UTF-8 UTF-8" > /etc/locale.gen
で/etc/locale.gen
ファイルを上書きしても良い。だが、 "ja_JP.UTF-8 UTF-8" のコメントを外すという目的なので最終的にはsed -i -E 's/# (ja_JP.UTF-8)/\1/' /etc/locale.gen
が良いと思う。
おわりに
MySQL コンテナで日本語が表示されないことに気がつき、続いて日本語が入力できないことにも気がつきました。ロケールの存在は知っておりましたけれども今回初めて強く意識いたしました。
ロケールとタイムゾーンがごっちゃゴチャになっていた節が今までありましたけれども、別物であると少しはっきり意識できたようにも思います。
勉強になりました。 以上です。