カテゴリー
Linux

Debian ベースの Docker コンテナの中で日本語を使えるようにするまで

はじめに

CLI で日本語を打とうとしたら、できませんでした。全角で日本語を打てるのですけれども、変換、確定するときに消えてしまいました。 vim をインストールし、そこで日本語を入力してみようとしてみましたが、やはりダメでした。別の文字へと変換されてしまったのです。例えば "あいう" => "~A~B~A~D~A~F" となってしまいました。

結論

  • コンテナ内の CLI ではやはり日本語を使用できていない。
  • コンテナ内の次の環境での結果
    • PHP の REPL (php -a): 日本語を使用できた。
    • MySQL クライアント (mysql -u root -p ...): 日本語を使用できた。
    • Vim: 日本語を使用できた。

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

参考

いろいろ検索して学んだこと

  • /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 コンテナで日本語が表示されないことに気がつき、続いて日本語が入力できないことにも気がつきました。ロケールの存在は知っておりましたけれども今回初めて強く意識いたしました。

ロケールとタイムゾーンがごっちゃゴチャになっていた節が今までありましたけれども、別物であると少しはっきり意識できたようにも思います。

勉強になりました。 以上です。

コメントを残す