dockerコンテナの日本語対応(centos)
dockerで公式centosイメージからコンテナを起動すると、時間とエンコードが日本語に対応していないので困った時の対策です。
前提
Software | Version |
---|---|
Docker | 17.06.2-ce |
手順
まずはcentosイメージをダウンロードします。
docker pull centos:latest % docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 328edcd84f1b 5 weeks ago 193MB centos 6.8 0cd976dc0a98 12 months ago 195MB
続いて、ダウンロードしたイメージでコンテナを起動します。
% docker run -i -t centos /bin/bash [root@7f86c5aa58d6 /]#
無事にコンテナに入ったら、時間が正しいか確認してみます。
[root@7f86c5aa58d6 /]# date Tue Sep 12 15:40:21 UTC 2017
はい。UTC(協定世界時)になっているので、JST-9時間ですね。
もう時刻やらタイマーを乱用するプログラムの試験などする場合は、この上なく困ります。
更に、localeなんかも日本語等の無駄なものはイメージ作成時に軽量化のため削除されてしまっているわけです。
[root@d8e528556ee7 /]# locale LANG= LC_CTYPE="POSIX" LC_NUMERIC="POSIX" LC_TIME="POSIX" LC_COLLATE="POSIX" LC_MONETARY="POSIX" LC_MESSAGES="POSIX" LC_PAPER="POSIX" LC_NAME="POSIX" LC_ADDRESS="POSIX" LC_TELEPHONE="POSIX" LC_MEASUREMENT="POSIX" LC_IDENTIFICATION="POSIX" LC_ALL=
ですので、日本語化したcentosのイメージを新たに用意します。
イメージ生成用のDockerfileはこちら。
FROM centos:6.8 MAINTAINER "kzdev" <xxxx@gmail.com> RUN yum -y update RUN yum -y install epel-release RUN yum reinstall -y glibc-common ENV LANG ja_JP.UTF-8 ENV LANGUAGE ja_JP:ja ENV LANGUAGE ja_JP:ja RUN yum clean all RUN echo 'ZONE="Asia/Tokyo"' > /etc/sysconfig/clock RUN rm -f /etc/localtime RUN ln -fs /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
yum reinstall -y glibc-common
で削除されたlocale達を復活させます。
続いて時刻設定を行います。
RUN echo 'ZONE="Asia/Tokyo"' > /etc/sysconfig/clock
で、ハードウェアクロックのタイムゾーンをASIAに変更します。
次にシステムクロックの変更を以下で行います。
既に配置されている/etc/localtime
を削除して、同名でASIAのタイムゾーンファイルのシンボリックリンクを作成しています。
これでdocker imageをビルドします。
% docker build ./ -t centosj ... Removing intermediate container dcb5ad3e340f Step 12/12 : RUN ln -fs /usr/share/zoneinfo/Asia/Tokyo /etc/localtime ---> Running in 6c66749583f5 ---> 967ab0235536 Removing intermediate container 6c66749583f5 Successfully built 967ab0235536 Successfully tagged testdev:latest
と出たら成功です。
稼働確認
無事にイメージを作成できたので、コンテナを起動してきちんと日本語になっているか確認してみます。
% docker run -i -t centosj /bin/bash [root@65d95e00003c /]# date 2017年 9月 13日 水曜日 01:11:32 JST [root@65d95e00003c /]# locale LANG=ja_JP.UTF-8 LC_CTYPE="ja_JP.UTF-8" LC_NUMERIC="ja_JP.UTF-8" LC_TIME="ja_JP.UTF-8" LC_COLLATE="ja_JP.UTF-8" LC_MONETARY="ja_JP.UTF-8" LC_MESSAGES="ja_JP.UTF-8" LC_PAPER="ja_JP.UTF-8" LC_NAME="ja_JP.UTF-8" LC_ADDRESS="ja_JP.UTF-8" LC_TELEPHONE="ja_JP.UTF-8" LC_MEASUREMENT="ja_JP.UTF-8" LC_IDENTIFICATION="ja_JP.UTF-8" LC_ALL=
日本時間と日本語化が無事に確認できました。
まとめ
必要な環境や機能が出てきたら、Dockerfileに追記してイメージを作ってコンテナを上げて使うという繰り返しになります。 一度イメージを作ってしまえば、生成や破棄はすぐに出来るので、試験やちょっとした動作確認にはもってこいです。
必要な機能を搭載したイメージに関しては、ほとんどがdocker-hubに既に上がっているので、探してなかったら作るとかの方が時短にはなると思います。