Docker Composeいいよね。 めちゃくちゃ手軽に使えるし、慣れたらもう戻れない媚薬感がある。
僕の開発環境はcomposeで構築していて、Railsが載ってるWeb用イメージはRubyの公式Dockerイメージをベースに使ってるんだけど、 これだとDocker上で日本語が受け付けなくて何かと困ることが多い。
元のDockerfileは以下で、FROM debian:jessie
でわかるようにdebianが使われてる。
ruby/Dockerfile at 7a3e1295bbc840c350fc37d406692301b27f4e86 · docker-library/ruby
debianのロケール設定はUbuntuともちょっと違ったりして、調べて出て来る情報だと全然解決できなかったりする。 そして毎回この問題で困ってる自分も嫌なので、備忘録として残しておきたいと思う。
ちなみに結論からいうと、僕の場合の解決方法はこうだった。
ENV 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
コマンドを実行することで有効にできるとのこと。