投げ銭

★当サイトへの投げ銭(PayPal)★

LINK


(無償、寄付歓迎) logo
世界中で使われるISO標準オフィスソフト(MSオフィス互換)

★LibreOfficeの導入事例★
詳細について

人気の投稿(1ヶ月間)

Ad

Ad

投げ銭

★当サイトへの投げ銭(PayPal)★

2018年11月21日水曜日

【Linux CentOS 7】(ベースコンテナの作成)SSH接続可能なDockerコンテナでの日本用ロケールの有効化と検証(man,dateの日本語表示)【Docker-ce 18.06.1.ce】

(警告)
ここで作成しているDockerコンテナは、信頼のおけるローカルネットワークのみで動作するホストで運用するものとして構築している。
ホスト上のいずれかのネットワークインターフェイスがインターネットに直接接している場合、このコンテナの運用はセキュリティの観点から非常に危険なので動作させてはいけない。
(Dockerのデフォルトでは外部からのアクセスを許してしまうことになってしまうため。)


以下で用いているコンテナは、
【Linux CentOS 7】Dockerコンテナへssh接続する方法や、コンテナのイメージ化、削除、起動方法などについて【Docker-ce 18.06.1.ce】」で作成したイメージから生成している。
その大本は、CentOS7の公式イメージである。


次のコマンドでイメージからコンテナを生成し動作させた。

# docker run --privileged -d -p 222:22 --name centos7-ja image-centos7-ssh /sbin/init
2d82556b4724a2b3a8e86eb41c19e5e626e37199cbb66aff8d76f7c10a289ac9
そして、このコンテナにSSH接続を行った。

$ ssh -p 222 root@192.168.10.3
[root@2d82556b4724 ~]#

以下は、コンテナでの作業である。



■manと、man-pages-ja のインストール


Dockerコンテナ(公式CentOS7)でマニュアルデータを同時にダウンロードさせるためには、
yum.confの次の行をコメントアウトするか、
#tsflags=nodocs
あるいは、yumコマンドで下記の通りにオプションを指定する必要がある。


○manのインストールを行った。

[root@2d82556b4724 ~]# yum --setopt=tsflags='' install man
Installed:
  man-db.x86_64 0:2.6.3-9.el7                                                                                                                                         
Dependency Installed:
  groff-base.x86_64 0:1.22.2-8.el7                          less.x86_64 0:458-9.el7                          libpipeline.x86_64 0:1.2.3-3.el7                       
Complete!

manのマニュアルは表示できたものの、qコマンドで終了後、エラーが表示されていた。
[root@2d82556b4724 ~]# man man
man: can't set the locale; make sure $LC_* and $LANG are correct
lsマニュアルは表示されなかった。また、同じエラーが表示されていることがわかった。
[root@2d82556b4724 ~]# man ls
man: can't set the locale; make sure $LC_* and $LANG are correctNo manual entry for ls


○ 続いて、man-pages-ja のインストールを行った。

[root@2d82556b4724 ~]# yum --setopt=tsflags='' install man-pages-ja
Installed:
  man-pages-ja.noarch 0:20130615-2.el7                                                                                                                               
Complete!

manのマニュアルは表示できたものの、qコマンドで終了後、エラーが表示されていた。
[root@2d82556b4724 ~]# man man
man: can't set the locale; make sure $LC_* and $LANG are correct
lsマニュアルは表示されなかった。また、同じエラーが表示されていることがわかった。
[root@2d82556b4724 ~]# man ls
man: can't set the locale; make sure $LC_* and $LANG are correctNo manual entry for ls


■ロケールに関する動作検証


○LANG環境変数に値を設定して動作確認を行った。

しかし、LANG環境変数にen_US.UTF-8を入れてやると、エラーは表示されなかった。
[root@841b2757b89c ~]# LANG=en_US.UTF-8 man man

あるいは、LANG環境変数にCを入れても、エラーは表示されなかった。
[root@bb8b0b0cf804 ~]# LANG=C man man


○現在のデフォルトのLANG環境変数の値の確認した。

この値(ja_JP.utf8)ではエラーが発生するわけだ。
[root@2d82556b4724 ~]# echo $LANG
ja_JP.utf8
念の為に試してみた。(エントリは指定していない。)
[root@2d82556b4724 ~]# LANG=ja_JP.utf8 man 
man: can't set the locale; make sure $LC_* and $LANG are correct
What manual page do you want?

○localeコマンドでも現在の値を確認した。

ファイルやディレクトリが見つからないというエラーが発生していた。

[root@2d82556b4724 ~]# locale
locale: Cannot set LC_CTYPE to default locale: No such file or directorylocale: Cannot set LC_MESSAGES to default locale: No such file or directorylocale: Cannot set LC_ALL to default locale: No such file or directoryLANG=ja_JP.utf8
LC_CTYPE="ja_JP.utf8"
LC_NUMERIC="ja_JP.utf8"
LC_TIME="ja_JP.utf8"
LC_COLLATE="ja_JP.utf8"
LC_MONETARY="ja_JP.utf8"
LC_MESSAGES="ja_JP.utf8"
LC_PAPER="ja_JP.utf8"
LC_NAME="ja_JP.utf8"
LC_ADDRESS="ja_JP.utf8"
LC_TELEPHONE="ja_JP.utf8"
LC_MEASUREMENT="ja_JP.utf8"
LC_IDENTIFICATION="ja_JP.utf8"
LC_ALL=

○このlocaleコマンドでも、LANGに en_US.UTF-8 をセットして呼び出した。

エラーは出なくなった。

[root@2d82556b4724 ~]# LANG=en_US.UTF-8 locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=


○システムのデフォルト値と、LANG変数の継承

システムロケールは、en_US.UTF-8 になっていた。

[root@bb8b0b0cf804 ~]# localectl status
   System Locale: LANG=en_US.UTF-8
       VC Keymap: us
      X11 Layout: us

しかし、実際のLANG変数は、上記の明らかになったように、ja_JP.utf8になっていた。
これはSSH接続の際に、接続元のLANGを引き継いだからだと考えられる。
そのため、LANG変数が、ja_JP.utf8 にセットしなおされたのだろう。


○このことを確かめるため、接続元において、LANG=C を指定しSSH接続を行った。

LANG=Cを明示しsshコマンドでコンテナに再接続した。
今度は、LANG=C が継承されるはずである。

$ LANG=C ssh -p 222 root@192.168.10.3
root@192.168.10.3's password:
Last login:
manコマンドを実行してもエラーは発生しなかった。
[root@841b2757b89c ~]# man man

lsのマニュアルは、エラーは発生しないものの、表示されないままだった。
[root@2d82556b4724 ~]# man ls
No manual entry for ls
LANG変数は、C となっていた。
[root@2d82556b4724 ~]# echo $LANG
C
localeコマンドもエラーは発生しなかった。
[root@2d82556b4724 ~]# locale
LANG=C
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=
LANG変数が適切であれば、ロケールに関するエラーは発生しない。



■LANG=ja_JP.utf8 でもエラーが発生しないようにする。


○次のコマンドでシステムにおいて利用可能なロケールが一覧できる。

しかしこの中には、ja_JP.utf8 は存在していなかった。

[root@2d82556b4724 ~]# locale -a
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_COLLATE to default locale: No such file or directory

C
POSIX
en_AG
en_AG.utf8
en_AU
en_AU.iso88591
en_AU.utf8
en_BW
en_BW.iso88591
en_BW.utf8
en_CA
en_CA.iso88591
en_CA.utf8
en_DK
en_DK.iso88591
en_DK.utf8
en_GB
en_GB.iso88591
en_GB.iso885915
en_GB.utf8
en_HK
en_HK.iso88591
en_HK.utf8
en_IE
en_IE.iso88591
en_IE.iso885915@euro
en_IE.utf8
en_IE@euro
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ
en_NZ.iso88591
en_NZ.utf8
en_PH
en_PH.iso88591
en_PH.utf8
en_SG
en_SG.iso88591
en_SG.utf8
en_US
en_US.iso88591
en_US.iso885915
en_US.utf8
en_ZA
en_ZA.iso88591
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW
en_ZW.iso88591
en_ZW.utf8

○ja_JPロケールファイルは存在していた。

[root@2d82556b4724 ~]# ls /usr/share/i18n/locales/ | grep ja
ja_JP
しかし、UTF-8エンコーディングのja_JPロケールファイルは存在していない。
この場合、自分で作成する必要がある。(†1)


○ja_JP.UTF-8ロケールファイルを生成した。

[root@2d82556b4724 ~]# localedef -v -c -i ja_JP -f UTF-8 ja_JP.UTF-8 
/usr/share/i18n/locales/ja_JP:11: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:12: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:15: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:18: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:19: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:20: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:21: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:23: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:24: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:25: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:26: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:27: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:28: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:29: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:30: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:31: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:32: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:33: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:42: non-symbolic character value should not be used
/usr/share/i18n/locales/i18n:1425: non-symbolic character value should not be used
/usr/share/i18n/locales/i18n:1674: non-symbolic character value should not be used
/usr/share/i18n/locales/i18n:1719: non-symbolic character value should not be used
/usr/share/i18n/locales/i18n:1756: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:1675: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:1676: non-symbolic character value should not be used
/usr/share/i18n/locales/translit_neutral:10: non-symbolic character value should not be used
/usr/share/i18n/locales/translit_neutral:11: non-symbolic character value should not be used
/usr/share/i18n/locales/translit_neutral:12: non-symbolic character value should not be used
/usr/share/i18n/locales/translit_neutral:13: non-symbolic character value should not be used
/usr/share/i18n/locales/translit_neutral:14: non-symbolic character value should not be used
/usr/share/i18n/locales/translit_neutral:15: non-symbolic character value should not be used
/usr/share/i18n/locales/translit_neutral:16: non-symbolic character value should not be used
/usr/share/i18n/locales/translit_neutral:17: non-symbolic character value should not be used
LC_ADDRESS: field `country_name' not defined
LC_ADDRESS: field `country_post' not defined
LC_ADDRESS: field `country_car' not defined
LC_ADDRESS: field `country_isbn' not defined
LC_ADDRESS: field `lang_name' not defined
LC_ADDRESS: field `lang_term' not defined
LC_ADDRESS: field `lang_ab' not defined
LC_TELEPHONE: field `int_select' not defined
LC_IDENTIFICATION: field `audience' not defined
LC_IDENTIFICATION: field `application' not defined
LC_IDENTIFICATION: field `abbreviation' not defined
LC_IDENTIFICATION: no identification for category `LC_MEASUREMENT'
LC_CTYPE: table for class "upper": 1756 bytes
LC_CTYPE: table for class "lower": 1756 bytes
LC_CTYPE: table for class "alpha": 4320 bytes
LC_CTYPE: table for class "digit": 600 bytes
LC_CTYPE: table for class "xdigit": 600 bytes
LC_CTYPE: table for class "space": 856 bytes
LC_CTYPE: table for class "print": 5976 bytes
LC_CTYPE: table for class "graph": 5976 bytes
LC_CTYPE: table for class "blank": 856 bytes
LC_CTYPE: table for class "cntrl": 664 bytes
LC_CTYPE: table for class "punct": 4824 bytes
LC_CTYPE: table for class "alnum": 4320 bytes
LC_CTYPE: table for class "combining": 3152 bytes
LC_CTYPE: table for class "combining_level3": 2832 bytes
LC_CTYPE: table for class "jspace": 600 bytes
LC_CTYPE: table for class "jhira": 600 bytes
LC_CTYPE: table for class "jkata": 664 bytes
LC_CTYPE: table for class "jkanji": 3224 bytes
LC_CTYPE: table for class "jdigit": 600 bytes
LC_CTYPE: table for map "toupper": 16924 bytes
LC_CTYPE: table for map "tolower": 15388 bytes
LC_CTYPE: table for map "totitle": 16924 bytes
LC_CTYPE: table for map "tojhira": 2584 bytes
LC_CTYPE: table for map "tojkata": 3096 bytes
LC_CTYPE: table for width: 26712 bytes
(あるいは、localedef -f UTF-8 -i ja_JP ja_JP.utf8 でも可能だった。)


○再度、利用可能なロケール一覧を表示させた。

一番下に、ja_JP.utf8 ロケールが現れ、エラーが解消された。

[root@2d82556b4724 ~]# locale -a
C
POSIX
en_AG
en_AG.utf8
en_AU
en_AU.iso88591
en_AU.utf8
en_BW
en_BW.iso88591
en_BW.utf8
en_CA
en_CA.iso88591
en_CA.utf8
en_DK
en_DK.iso88591
en_DK.utf8
en_GB
en_GB.iso88591
en_GB.iso885915
en_GB.utf8
en_HK
en_HK.iso88591
en_HK.utf8
en_IE
en_IE.iso88591
en_IE.iso885915@euro
en_IE.utf8
en_IE@euro
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ
en_NZ.iso88591
en_NZ.utf8
en_PH
en_PH.iso88591
en_PH.utf8
en_SG
en_SG.iso88591
en_SG.utf8
en_US
en_US.iso88591
en_US.iso885915
en_US.utf8
en_ZA
en_ZA.iso88591
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW
en_ZW.iso88591
en_ZW.utf8
ja_JP.utf8


■manの動作確認

manのマニュアルは表示はできたが相変わらず英語表記だった。

[root@2d82556b4724 ~]# man man

一方、lsやcpコマンドのマニュアルは表示されるようになり、しかも日本語表記だった。

[root@2d82556b4724 ~]# man ls 
[root@2d82556b4724 ~]# man cp
CP(1)                                                                     ユーザーコマンド                                                                    CP(1)
名前
       cp - ファイルやディレクトリのコピーを行う
書式
       cp [OPTION]... [-T] SOURCE DEST
       cp [OPTION]... SOURCE... DIRECTORY
       cp [OPTION]... -t DIRECTORY SOURCE...
説明
       SOURCE から DEST へ、または複数の SOURCE を DIRECTORY へコピーします。

以上のことから、man-pages-ja パッケージを導入し、なおかつ、ja_JP.utf8ロケールが利用可能な場合に、lsやcpのマニュアルが日本語で表示できるのだとわかった。



■日時の表記について

上記の手順でロケールが利用可能になり、日時の表記は英語でなく日本語になった。

[root@4dd9c2c92bad ~]# date
2018年 12月 31日 月曜日 18:22:15 UTC

しかし、日本時間から9時間遅れていた。


○設定されているローカルタイム情報

[root@4dd9c2c92bad ~]# timedatectl status
      Local time: 月 2018-12-31 18:24:16 UTC
  Universal time: 月 2018-12-31 18:24:16 UTC
        RTC time: 月 2018-12-31 18:24:15
       Time zone: UTC (UTC, +0000)
     NTP enabled: n/a
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a

○タイムゾーンをアジア/東京に設定

[root@4dd9c2c92bad ~]# timedatectl set-timezone Asia/Tokyo

状態の確認
[root@4dd9c2c92bad ~]# timedatectl status
      Local time: 火 2019-01-01 03:24:47 JST
  Universal time: 月 2018-12-31 18:24:47 UTC
        RTC time: 月 2018-12-31 18:24:46
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: n/a
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a
日時の表示(日本時間)
[root@4dd9c2c92bad ~]# date
2019年  1月  1日 火曜日 03:24:55 JST


○timedatectlコマンドでなく次の方法でも可能

localtimeはバイナリだが、catで出力すると、UTC0という文字列が見えた。

[root@2d82556b4724 ~]# cat /etc/localtime
TZif2 UTCTZif2 UTC
UTC0
さきほどの/etc/localtimeバイナリファイルを、次のファイルで上書きした。

[root@2d82556b4724 ~]# cp /usr/share/zoneinfo/Japan /etc/localtime
cp: overwrite ‘/etc/localtime’? y

現在の日本時間で表示可能になった。

[root@2d82556b4724 ~]# date
2018年 11月 21日 水曜日 09:31:26 JST



■コミットしてイメージ化

設定が全て終わったら、コンテナを終了した後に、Dockerホスト側でイメージ化しておく。

コンテナを終了した。
[root@2d82556b4724 ~]# poweroff


Dockerホストに接続してコンテナをコミットした。
# docker commit 2d82556b4724 image-cetos7-ja

# docker image list | grep image-cetos7-ja
image-cetos7-ja                    latest              d8e8b34178ff        7 hours ago         683MB


◆glibc のアップデートで上記の設定が失われた。

〇アップデート後にロケールが失われた。

アップデート前
#  LANG=ja_JP.utf8 date
2018年 12月  8日 土曜日 19:21:09 JST

アップデート
# yum update glibc
Updated:
  glibc.x86_64 0:2.17-260.el7
Dependency Updated:
  glibc-common.x86_64 0:2.17-260.el7
Complete!

アップデート後
# LANG=ja_JP.utf8 date
Sat Dec  8 19:26:41 JST 2018

使用できるロケールがほとんど失われた。(上記のものと比較)
# locale -a
C
POSIX
en_US.utf8

〇再び日本用のロケールを追加した。

# localedef -v -c -i ja_JP -f UTF-8 ja_JP.UTF-8
# locale -a
C
POSIX
en_US.utf8
ja_JP.utf8
# LANG=ja_JP.utf8 date
2018年 12月  8日 土曜日 19:39:10 JST 

以上




<参考>

○ロケールの設定について

(1) locale: Cannot Set LC_ALL to default locale: No such file or directory.
< https://www.linuxquestions.org/questions/linux-general-1/locale-cannot-set-lc_all-to-default-locale-no-such-file-or-directory-218622/ > 2018年11月21日

・How to set up a clean UTF-8 environment in Linux
< https://perlgeek.de/en/article/set-up-a-clean-utf8-environment > 2018年11月21日

・【Linux入門】ローカライゼーションのためのロケール情報設定方法
< https://eng-entrance.com/linux-localization-locale > 2018年11月21日

・Linuxのローカライゼーション系LANG変数:langについて
< https://eng-entrance.com/linux-localization-lang > 2018年11月21日

・ロケールの確認・設定
< http://hogepon.net/2016/12/01/post-25/ > 2018年11月21日

・[CentOS]CentOS7でのロケール(locale)の確認及び変更
< https://zero-config.com/centos/changelocale-002.html > 2018年11月21日

・How to Set Up System Locale on CentOS 7
< https://www.rosehosting.com/blog/how-to-set-up-system-locale-on-centos-7/ > 2018年11月21日

・CentOS 7 コンテナに消えない日本語ロケールを追加する
< https://qiita.com/teruo-oshida/items/08cb84efc2b581b0a439 > 2018年11月21日


○manについて

・Centos7のmanコマンドを日本語化する
< https://www.linux.ambitious-engineer.com/?p=982 > 2018年11月21日

・No manual entry for man
< https://unix.stackexchange.com/questions/182500/no-manual-entry-for-man > 2018年11月21日

・How to install man pages on centos?
< https://unix.stackexchange.com/questions/252530/how-to-install-man-pages-on-centos > 2018年11月21日


○日時について
・【設定確認から変更方法まで】Linuxでのタイムゾーンの扱い方
< https://eng-entrance.com/linux-time-timezone > 2019年1月1日

・Vagrant の CentOS 6 の時計時刻や表記を日本対応させる手順
< https://weblabo.oscasierra.net/vagrant-centos6-japanize/ > 2018年11月21日




投げ銭

★当サイトへの投げ銭(PayPal)★

Ad

Ad