a tomato

トマトが大好きです

dockerコンテナの日本語対応(centos)

dockerで公式centosイメージからコンテナを起動すると、時間とエンコードが日本語に対応していないので困った時の対策です。

f:id:kzdev:20170913005837p:plain

公式 www.docker.com

前提

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
2017913日 水曜日 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に既に上がっているので、探してなかったら作るとかの方が時短にはなると思います。

https://hub.docker.com