Docker Composeはいいですよね。 とても手軽に使えますし、慣れたらもう戻れない魅力があります。
自分の開発環境はcomposeで構築していて、Railsが載っているWeb用イメージはRubyの公式Dockerイメージをベースに使っているのですが、 これだとDocker上で日本語が受け付けなくて何かと困ることが多いです。
元のDockerfileは以下で、FROM debian:jessieでわかるようにdebianが使われています。
ruby/Dockerfile at 7a3e1295bbc840c350fc37d406692301b27f4e86 · docker-library/ruby
debianのロケール設定はUbuntuともちょっと違ったりして、調べて出てくる情報だと全然解決できなかったりします。 そして毎回この問題で困っている自分も嫌なので、備忘録として残しておきたいと思います。
ちなみに結論からいうと、自分の場合の解決方法はこちらでした。
1ENV LANG C.UTF-8
いろいろ調べてみるとロケールの設定によるもののようです。 この辺りは少し難しいのであまり理解できていませんが、そのうちちゃんと勉強したいところです。
だいたいは言語のパッケージを入れて、ロケールを設定すればいけるという説明なのですが、 Debianだと少し勝手が違ったり、そもそもそれでは直らなかったりします。
Ubuntuだとこのような形で、言語パックが導入できるようです。
1apt-get install language-pack-ja-base language-pack-ja
これがDebianだとこうなります。
1apt-get install task-japanese
まあこれが原因ではなかったのですが、UbuntuとDebianでこのような些細な違いがあったりするのだなと。
散々探し回ったのに、この記事で完璧に説明されていました・・・。
たぶんLANG設定をすればうまくいきます
FROM ruby:2.2.3 ENV LANG C.UTF-8
うまくいきました。
OSの動作をどういう言語で行うかを設定するものなのだろう、くらいの認識です。
Linux では Locale を使ってユーザーがどの言語を使うか定義します。また、locale は使われる文字セットも定義するので、あなたの使っている言語が非 ASCII 文字を含んでいる場合、正しい locale を設定することは特に重要になります。
ではlocaleコマンドで表示される変数はどういう意味を持っているのかというと、
1LANG="en_US.UTF-8" 2LC_COLLATE="en_US.UTF-8" 3LC_CTYPE="en_US.UTF-8" 4LC_MESSAGES="en_US.UTF-8" 5LC_MONETARY="en_US.UTF-8" 6LC_NUMERIC="en_US.UTF-8" 7LC_TIME="en_US.UTF-8" 8LC_ALL="en_US.UTF-8"
このような意味があるようです。
| 環境変数 | 意味 |
|---|---|
| LC_CTYPE | 文字の分類および大文字/小文字の変換。 |
| LC_NUMERIC | 小数区切り文字 (または基数文字)、千の区切り文字、およびグループ化を指定します。 |
| LC_TIME | 月の名前、曜日、一般的な完全表示や短縮表示など、日付や時刻の書式を指定します。 |
| LC_MONETARY | ロケールの通貨記号、千の区切り文字、符号の位置、小数点以下の桁数など、通貨の書式を指定します。 |
| LC_COLLATE | ロケールの照合順序および正規表現の定義を指定します。 |
| LC_MESSAGES | ロケールのローカライズメッセージの記述言語、および肯定と否定の応答 (yes と no の文字列と表現) を指定します。 |
言語によっては最初から利用可能だったり、そうでなかったりするようです。
利用可能なロケールはlocale -aで確認できます。
1$ locale -a 2af_ZA 3af_ZA.ISO8859-1 4af_ZA.ISO8859-15 5af_ZA.UTF-8 6am_ET 7am_ET.UTF-8 8be_BY 9be_BY.CP1131 10be_BY.CP1251 11be_BY.ISO8859-5 12 : 13 :
Debian系の場合は、/etc/locale.genに書いてあるロケールのコメントアウトを解除してlocale-genコマンドを実行することで有効にできるとのことです。