何がしたいか
Docker imageのAmazonlinuxを使った開発環境で日本語を含んだファイルが文字化けしたので、これをなんとかしたい。
https://hub.docker.com/_/amazonlinux/
ファイルの文字コードはCP932であることはわかっていたのだけど、iconvを通してもUTF-8に変換されず、ハマってしまった。
どう解決したか
DockerfileにENVコマンドを下記のように追加することで解決した。
FROM amazonlinux:latest
RUN yum -y update && yum clean all
~中略~
ENV LANG en_US.UTF-8
なぜen_US.UTF-8
なのかというと、AWSのEC2でもおそらくデフォルトがen_US.UTF-8
になっているため(後述)。
少なくとも自分が扱う要件では、en_US.UTF-8
で問題なかったのでそのままにしている。
このようにしておけば、下記のlocaleが設定されるようになる。
$ 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=
他のlocaleにする必要があるのであれば、それを指定してもらえれば良いと思う。
ただし、Docker imageのAmazonlinuxで最初から用意されているのは下記のlocaleとなっているらしいので、
$ locale -a
C
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@euro
en_IE.iso88591
en_IE.iso885915@euro
en_IE.utf8
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
POSIX
EC2ではどうなっていたか
確認に使ったのは下記のAMI。現時点(2017/11/07)では、Management ConsoleからEC2インスタンスの作成でAmazon Linux AMIを選択すれば使用されるAMIとなっている。
amzn-ami-hvm-2017.09.0.20170930-x86_64-gp2 (ami-2a69be4c)
上記のAMIを使って作成したEC2インスタンスでは、下記のような locale 設定になっているはず。
$ 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=