前提
実現したいこと
DockerでPostgresを使用する際、文字列のカラムを日本語基準でソートしたい。
ただし、ログなどは英語のままにしたい。
やってみたこと
カスタムのDockerfileを作成し、PostgresのDockerイメージにja_JP.utf8
ロケールを追加する。
また、以下のロケール環境変数のみja_JP.utf8
を設定する。
LC_CTYPE
LC_COLLATE
Dockerfile
FROM postgres:15.3
RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* \
&& localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
ENV LC_CTYPE=ja_JP.UTF-8
ENV LC_COLLATE=ja_JP.UTF-8
docker-compose.yml
db:
build:
context: .
dockerfile: Dockerfile
container_name: postgres
発生した問題
Dockerを起動したところ、以下のエラーが発生した。
initdb: error: invalid locale settings; check LANG and LC_* environment variables
解決策
すでに設定していたLC_CTYPE
とLC_COLLATE
の他に、 全ての主要なロケール環境変数について明示的に設定した 。
この方法で、Docker起動時にエラーが発生しなくなった。
Dockerfile
FROM postgres:15.3
RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* \
&& localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
ENV LC_CTYPE=ja_JP.UTF-8
ENV LC_COLLATE=ja_JP.UTF-8
+ ENV LC_MESSAGES=C.UTF-8
+ ENV LC_NUMERIC=C.UTF-8
+ ENV LC_TIME=C.UTF-8
+ ENV LC_MONETARY=C.UTF-8
(補足)エラーが発生しないロケール環境変数の設定方法
Dockerfile
にて、ロケール環境変数の設定を正しく行わないとエラーが発生する。
正しい(エラーが発生しない)設定方法は以下の通り。
LANG
を設定する
Dockerfile
FROM postgres:15.3
RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* \
&& localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
ENV LANG=ja_JP.UTF-8
この方法だと、環境変数によってロケールの設定を分けることはできない。
→ 実現したいことが達成できないため、不採用。
LC_ALL
を設定する
Dockerfile
FROM postgres:15.3
RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* \
&& localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
ENV LC_ALL=ja_JP.UTF-8
この方法だと、環境変数によってロケールの設定を分けることはできない。
→ 実現したいことが達成できないため、不採用。
全ての主要なロケール環境変数を1つずつ個別に設定する
解決策にて記述した内容。
最低でも以下を設定すれば良い。
LC_CTYPE
LC_COLLATE
LC_MESSAGES
LC_NUMERIC
LC_TIME
LC_MONETARY
この方法だと、 環境変数によってロケールの設定を分けることができる 。