4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Dockerfile】【PostgreSQL】ロケール環境変数の設定をした際に発生したエラーと解決策

Last updated at Posted at 2024-10-01

前提

実現したいこと

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_CTYPELC_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

この方法だと、 環境変数によってロケールの設定を分けることができる

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?