#初めに
わかってみれば、当たり前で簡単なのですが、結構ハマったので備忘録的に記事を書きます。
サンプルはJavaですが、多分どの言語・環境でも同様だと思います。
#実験環境
参考までに
dockerのコンテナイメージは
officialのcentosイメージを使用しております。
#実験
public class Main
{
public static void main (String[] args) throws java.lang.Exception
{
System.out.println(System.getProperty("file.encoding"));
}
}
このようなデフォルトエンコーディングを取得するプログラムがあリます。
参考:
デフォルトエンコーディングの確認
http://www.javadrive.jp/start/encoding/index1.html
これをdocker内で実行してみます。
#docker内に入る
docker run -it centos
#上のプログラムを書く
vi Main.java
javac Main.java && java Main
そうすると以下の出力が出ます。
ANSI_X3.4-1968
これだとUTF-8のテキストを扱うのが面倒なので、
デフォルトの言語設定をUTF-8にしたいのです。
#正しい方法
答えを先に書くと、
(色々端折りましたが)
docker run -e LANG=ja_JP.UTF-8 -it centos /bin/bash -c "java Main"
UTF-8
のように -e LANG=ja_JP.UTF-8 を付ければLANGの環境変数が設定され、デフォルトエンコーディングの設定になります。
もちろん-e をつけなければ「ANSI_X3.4-1968」になりました。
毎回指定しなくてもいい方法もありそうですが、
自分の場合は、これで十分です。
#試行錯誤
##ひとこと
dockerで色々してるのですが、システムの言語設定の変更の仕方がどうしてもわからず、2,3ヶ月ほど試行錯誤しました。
ただ、わかってみれば簡単でした。
ダメな例でも得るものはあると思うので、ログとして書きます。
##試行錯誤のログ
コンテナのOSのLANG設定を変えないといけないと思い、
export LANG=ja_JP.UTF-8
をコンテナOSの./bash_profile や./bashrcに書いたりしましたが、実行中は反映されましたが、再度runし直すと反映されませんでした。
参考:
Docker: コンテナのlocaleを設定したい
http://qiita.com/suin/items/856bf782d0d295352e51
をやってみましたが、僕のやり方がおかしかったのかうまく行かず
参考:
docker で warning: setlocale: LC_ALL: cannot change locale (ja_JP.UTF-8) などといわれたら
http://qiita.com/amanoiverse/items/761994974686480a50b5
をやってみましたが、
Failed to get D-Bus connection: No connection to service manager.
と言われ、続いて
参考:
Failed to get D-Bus connection: No connection to service manager.の対処
http://qiita.com/tukiyo3/items/b24e4dc62de59d4a7570
をみてやってみましたが、結局LANGを設定することはできず。
別のイメージを試すとか、
インタラクティブモードとかログインシェルがどうのこうの
色々やっておりましたが、結局できず諦めてました。
参考:
CircleCIでDockerコンテナ上でテストするときに環境変数を渡す
http://qiita.com/eielh/items/49b80ea489c140f2f4c8
このページをたまたま見つけて、
docker run -e HOGE=$HOGE -e GORO=$GORO -e MOGU=$MOGU ....
環境変数をこの様に設定できると知って、意外とあっけなく決着しました。
#反省
実はかなり困ってましたが、なんとか決着できて良かったです。
環境変数は、./bash_profileに書くものだからコンテナ内で書くという思い込みがあったのかもしれません。
つらい。(´・_・`)