はじめに
Docker の centos:centos7 は locale -a | grep -c ja_JP
がゼロ、つまり日本語ロケールが定義されていません。
これはイメージサイズを縮小するための措置です。
ロケールは /usr/lib/locale/locale-archive に記録されていますが、フルサイズでは 102M というサイズです。コンテナ観点では、これが大きすぎる、というのは自然な発想かと思います。
そして、日本語ロケールは localedef で登録することが可能ですが、glibc-common を yum update
すると消えてしまいますw
で、本ポストは「俺のロケールを消した奴は誰だ?」の回答・対処法と、localectl コマンド(非特権コンテナでは実行できないコマンド)によってロケール設定を操作した結果を紹介します。
犯人の紹介
まずは犯人から。最初からクライマ(略
(略)
override_install_langs=en_US.utf8
(略)
これです。この指定(ホワイトリスト)によってロケールを制限しています。
にしても「/usr/share/doc が空っぽ」と同じ犯人です。やってくれるぜ。
対処法
まず、前述の設定を消してしまえば、ロケールが制限されなくなります。ただし locale-archive が 102M になってしまいます。
なので、丁寧なのは "ja_JP.utf8" を追記することかと思います。
sed -i -e '/override_install_langs/s/$/,ja_JP.utf8/g' /etc/yum.conf
その後 glibc-common をアップデートすれば日本語ロケールが出現します。
glibc-common が既に最新という場合は rpm --force
で強制的にインストールしましょう。
(nodocs と同じで、そもそも rpm コマンドを使えば yum.conf の影響は受けないんですけれども。。。)
# locale -a
C
POSIX
en_US.utf8
ja_JP.utf8
# ls -lh /usr/lib/locale/locale-archive
-rw-r--r-- 1 root root 2.5M Jul 3 12:34 /usr/lib/locale/locale-archive
なお、glibc-common の postinstall scriptlet を実行しただけでは日本語ロケールは出現しません。
これは、locale-archive が locale-archive.tmpl から間引く形で生成されていて、一度 scriptlet が動いてしまうと locale-archive.tmpl が空になってしまうためです。
localectl 結果
日本語ロケールを出現させることが出来でも、それを使用する設定は別途必要です。
簡単には環境変数 LANG を設定すれば終わりなんですが、フル機能の OS のシステム設定がどうなるか、気になりますよね。私は気になります。
なので、localectl コマンドの結果を載せておきます。
(言いつつ /etc を grep しただけの差分なので、網羅されてないかも知れません。誰かソース見て処理を追いかけてくださいな。)
# localectl set-locale LANG=ja_JP.UTF-8
# cat /etc/locale.conf
LANG=ja_JP.UTF-8
# localectl set-x11-keymap jp
# cat /etc/vconsole.conf
KEYMAP=jp106
FONT=latarcyrheb-sun16
# cat /etc/X11/xorg.conf.d/00-keyboard.conf
# Read and parsed by systemd-localed. It's probably wise not to edit this file
# manually too freely.
Section "InputClass"
Identifier "system-keyboard"
MatchIsKeyboard "on"
Option "XkbLayout" "jp"
EndSection
対比用に初期値(コンテナイメージ centos:centos7 の初期値)も載せておきます。
# cat /etc/locale.conf
LANG="en_US.UTF-8"
# cat /etc/vconsole.conf
KEYMAP="us"
FONT="latarcyrheb-sun16"
# cat /etc/X11/xorg.conf.d/00-keyboard.conf
# Read and parsed by systemd-localed. It's probably wise not to edit this file
# manually too freely.
Section "InputClass"
Identifier "system-keyboard"
MatchIsKeyboard "on"
Option "XkbLayout" "us"
EndSection
そういえば、インストーラでインストールした CentOS 7.5 では vconsole.conf の KEYMAP は jp でした。