Docker 環境で、PostgreSQL を日本語ロケールで動作させたかったので調べてみました。
今回は、Dockerfile で、PostgreSQLを作成し、 docker-compose.yml ファイルで使用するロケールを指定します。
注意事項
ここで紹介するのは、いったん作成したPostgreSQLデータベースのロケールを変更する方法ではありません。PostgreSQL のDocker イメージ作成時に日本語ロケールで作成して実行する方法です。
Dockerfile を作成する
PostgreSQL の Dockerfile を作成します。
今回は、公式イメージを使います。 素直に公式サイトの説明に従います。
ただし、使用する言語は、 docker-compose.yml
ファイル側で指定したいので、 ARG
を使います。
ここでは、 docker-compose.yml
側で、言語が指定されなかった場合のデフォルト値として、 en_US
を指定するため、ARG DB_LANG=en_US
とします。
FROM postgres:12.1
ARG DB_LANG=en_US
RUN localedef -i $DB_LANG -c -f UTF-8 -A /usr/share/locale/locale.alias $DB_LANG.UTF-8
ENV LANG $DB_LANG.utf8
docker-compose.yml を作成する
docker-compose.yml
ファイルを作成します。
PostgreSQL のイメージ作成 ( build
) 時に、言語を引き渡せるように args
を使います。
version: '3'
services:
db:
build:
context: .
dockerfile: ./dockerfiles/postgresql/Dockerfile
args:
- DB_LANG=ja_JP
volumes:
- pgsqldb:/var/lib/postgresql/data
environment:
- POSTGRES_USER
- POSTGRES_PASSWORD
volumes:
pgsqldb:
driver: local
立ち上げて確認する
ビルドして実行します。
$ env POSTGRES_USER=xxx POSTGRES_PASSWORD=yyy docker-compose up -d`
実際に確認してみましょう
$ docker-compose exec db bash
# psql non_exist_db -U postgres
psql: エラー: サーバに接続できませんでした: FATAL: データベース"non_exist_db"は存在しません
エラーメッセージが日本語になりました。
DB_LANG を指定しなかった場合
docker-compose.yml
で args
を指定しなかった場合は、 en_US
になります。