LoginSignup
3
3

Universal Base Images (UBI) 8 を日本語ロケールにする

Last updated at Posted at 2020-01-10

配布されている Universal Base Images (UBI) 8 のロケールは C.utf8 ですが、用途によっては日本語ロケール ja_JP.utf8 で使用したいことがあります。そこで、UBI 8 を日本語ロケールにする方法を調べてみました。
ここで扱うのは、UBI 8 で UBI minimal ではありません。

まずは、調査してみる

docker run --rm -it registry.access.redhat.com/ubi8/ubi:latest bash で起動して、淡い期待をもって locale -a を実行してみましたが、やはり最初から日本語ロケールが組み込まれているということはありませんでした。

C:\>docker run --rm -it registry.access.redhat.com/ubi8/ubi:latest bash
[root@61670851e75a /]# locale -a
C
C.utf8
POSIX

次に、利用できる langpacks をサーチしてみましたが、提供されているのは英語のものだけです。
glibc-all-langpacks.x86_64 がありますが、これを インストールしてもロケールは追加されませんでした。

[root@61670851e75a /]# dnf search langpacks
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
Last metadata expiration check: 0:02:02 ago on Fri Jan 10 07:24:31 2020.
========================================================= Name & Summary Matched: langpacks ==========================================================
langpacks-en.noarch : English langpacks meta-package
langpacks-en.noarch : English langpacks meta-package
============================================================== Name Matched: langpacks ===============================================================
glibc-all-langpacks.x86_64 : All language packs for glibc.

locale でサーチすると、いくつかパッケージが見つかりました。
glibc-common.x86_64 をインストールすると、en_XX 系のロケールはインストールできましたが、日本語は追加されません。
残るは、glibc-locale-source.x86_64 なるパッケージです。source とあるので、これを使って日本語ロケールを定義することにします。

[root@61670851e75a /]# dnf search locale
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
Last metadata expiration check: 0:17:23 ago on 2020年01月10日 07時24分31秒.
=========================================================== Name & Summary Matched: locale ===========================================================
glibc-locale-source.x86_64 : The sources for the locales
perl-Encode-Locale.noarch : Determine the locale encoding
perl-Locale-Codes.noarch : Distribution of modules to handle locale codes
perl-Locale-Maketext-Simple.noarch : Simple interface to Locale::Maketext::Lexicon
================================================================ Name Matched: locale ================================================================
perl-Locale-Maketext.noarch : Framework for localization
============================================================== Summary Matched: locale ===============================================================
glibc-langpack-en.x86_64 : Locale data for en
glibc-common.x86_64 : Common binaries and locale data for glibc
glibc-common.x86_64 : Common binaries and locale data for glibc

日本語ロケールを組み込む

dnf install -y glibc-locale-source で source をインストールし、localedef で日本語ロケールを定義することで、日本語ロケールが使用できるようになりました。
手順は以下の通りですが、分かってしまうと簡単ですね。

C:\>docker run --rm -it registry.access.redhat.com/ubi8/ubi:latest bash
[root@0f88101d5c72 /]# dnf install -y glibc-locale-source
(出力は省略)
[root@0f88101d5c72 /]# localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
[root@0f88101d5c72 /]# locale -a
C
C.utf8
POSIX
ja_JP.utf8
[root@0f88101d5c72 /]# echo LANG=ja_JP.UTF-8 > /etc/locale.conf
[root@0f88101d5c72 /]# export LANG=ja_JP.UTF-8
[root@0f88101d5c72 /]# export LC_ALL=ja_JP.UTF-8
[root@0f88101d5c72 /]# date
2020年  1月 10日 金曜日 07:53:26 UTC

タイムゾーンを変更する

date コマンドの出力を見て、タイムゾーンの変更が必要なことを思い出しました。
まずは、調査ですが、zoneinfo を確認してみると、各地域のゾーン情報(tzdata)が入っていて、Asia/Tokyo もありました。

[root@0f88101d5c72 /]# ls /usr/share/zoneinfo/
Africa      Atlantic   Canada  EST5EDT  GB       GMT0       Indian   Kwajalein  Mexico   PST8PDT   ROK        UTC        iso3166.tab  tzdata.zi
America     Australia  Chile   Egypt    GB-Eire  Greenwich  Iran     Libya      NZ       Pacific   Singapore  Universal  leapseconds  zone.tab
Antarctica  Brazil     Cuba    Eire     GMT      HST        Israel   MET        NZ-CHAT  Poland    Turkey     W-SU       posix        zone1970.tab
Arctic      CET        EET     Etc      GMT+0    Hongkong   Jamaica  MST        Navajo   Portugal  UCT        WET        posixrules
Asia        CST6CDT    EST     Europe   GMT-0    Iceland    Japan    MST7MDT    PRC      ROC       US         Zulu       right
[root@0f88101d5c72 /]# ls /usr/share/zoneinfo/Asia/Tokyo
/usr/share/zoneinfo/Asia/Tokyo

タイムゾーンは、普通の方法で変更するだけで済みました。

[root@0f88101d5c72 /]# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
[root@0f88101d5c72 /]# export TZ=Asia/Tokyo
[root@0f88101d5c72 /]# date
2020年  1月 10日 金曜日 17:03:05 JST

日本語ロケールにしたイメージをビルドする

手順が分かったので、Dockerfile を作ってイメージをビルドします。以下のような Dockerfile にしてみました。

FROM registry.access.redhat.com/ubi8/ubi:latest
RUN  dnf update -y \
  && dnf install -y glibc-locale-source \
  && localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8 \
  && echo LANG=ja_JP.UTF-8 > /etc/locale.conf \
  && dnf remove -y glibc-locale-source \
  && dnf clean all \
  && ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
ENV LANG="ja_JP.UTF-8" \
    LC_ALL="ja_JP.UTF-8" \
    TZ="Asia/Tokyo"

ビルドして確認してみます。

C:\ubi-jp>docker build -t ubi8-jp .
Sending build context to Docker daemon  2.048kB
(省略)
Successfully tagged ubi8-jp:latest
(省略)

C:\ubi-jp>docker run --rm -it ubi8-jp bash
[root@143587d7dbf8 /]# date
2020年  1月 10日 金曜日 17:09:51 JST
[root@143587d7dbf8 /]# ls -al
total 60
drwxr-xr-x   1 root root 4096  1月 10 17:09 .
(省略)
drwxr-xr-x   1 root root 4096 12月 11 02:50 var
[root@143587d7dbf8 /]# sss
bash: sss: command not found
[root@143587d7dbf8 /]#

最後に

UBI 8 を日本語ロケールに変更することができました。
詳細は触れませんが、UBI-minimal 8 や UBI 7 でもチャレンジしてみました。

UBI-minimal 8 は、UBI 8 と同じ方法で日本語ロケールを追加できました。但し、localedef が使用する gzip が入っていないので、追加する必要があります。
さらに、ゾーン情報(tzdata)は自力で追加する必要がありました。microdnf install -y tzdata で追加したいところですが、インストール後に不要なものを rm コマンドで削除しているようで、microdnf install -y tzdata を実行しても追加できませんでした。
rpm パッケージをダウンロードして rpm2cpio と cpio -idv を使って力ずくで追加するしか方法がなさそうでした。

microdnf install -y cpio
curl https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi8/8/x86_64/baseos/os/Packages/t/tzdata-2019c-1.el8.noarch.rpm | rpm2cpio | cpio -idv
ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
microdnf remove -y cpio
3
3
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
3
3