Docker

dockerのコンテナ実行時にLANGなどの環境変数を設定する方法

More than 3 years have passed since last update.


初めに

わかってみれば、当たり前で簡単なのですが、結構ハマったので備忘録的に記事を書きます。

サンプルはJavaですが、多分どの言語・環境でも同様だと思います。


実験環境

参考までに

dockerのコンテナイメージは

officialのcentosイメージを使用しております。

https://registry.hub.docker.com/_/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実行

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に書くものだからコンテナ内で書くという思い込みがあったのかもしれません。

つらい。(´・_・`)