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だとちょっと勝手が違ったり、そもそもそれじゃ直らなかったりする。

Language Pack

Ubuntuだとこんな感じで、言語パックが導入できるらしい。

apt-get install language-pack-ja-base language-pack-ja

これがDebianだとこう。

apt-get install task-japanese

まあこれが原因じゃなかったんだけど、UbuntuとDebianでこんな些細な違いがあったりするんだなと。

日本語を打てるようにする

散々探し回ったのに、この記事で完璧に説明されていた・・・。

たぶんLANG設定をすればうまくいきます

FROM ruby:2.2.3 ENV LANG C.UTF-8

Docker Compose でローカルの Rails 開発環境を作る - Qiita

うまくいきました。

結局のところロケールってどう使われてるの?

OSの動作をどういう言語で行うかを設定するものなんだろうくらいの認識。

Linux では Locale を使ってユーザーがどの言語を使うか定義します。また、locale は使われる文字セットも定義するので、あなたの使っている言語が非 ASCII 文字を含んでいる場合、正しい locale を設定することは特に重要になります。

ロケール - ArchWiki

じゃあlocaleコマンドで表示される変数はどういう意味を持ってるのかというと、

LANG="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL="en_US.UTF-8"

こんな感じらしい。

環境変数 意味
LC_CTYPE 文字の分類および大文字/小文字の変換。
LC_NUMERIC 小数区切り文字 (または基数文字)、千の区切り文字、およびグループ化を指定します。
LC_TIME 月の名前、曜日、一般的な完全表示や短縮表示など、日付や時刻の書式を指定します。
LC_MONETARY ロケールの通貨記号、千の区切り文字、符号の位置、小数点以下の桁数など、通貨の書式を指定します。
LC_COLLATE ロケールの照合順序および正規表現の定義を指定します。
LC_MESSAGES ロケールのローカライズメッセージの記述言語、および肯定と否定の応答 (yes と no の文字列と表現) を指定します。

ロケール(locale)まとめ - Qiita

利用可能なロケールを確認 / 追加する

言語によっては最初から利用可能だったり、そうじゃなかったりするらしい。 利用可能なロケールはlocale -aで確認できる。

$ locale -a
af_ZA
af_ZA.ISO8859-1
af_ZA.ISO8859-15
af_ZA.UTF-8
am_ET
am_ET.UTF-8
be_BY
be_BY.CP1131
be_BY.CP1251
be_BY.ISO8859-5
 :
 :

Debian系の場合は、/etc/locale.genに書いてあるロケールのコメントアウトを解除してlocale-genコマンドを実行することで有効にできるとのこと。

参考にさせて頂きました