(警告)
ここで作成している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日