Docker で起動するPostgreSQLのLocaleの初期値を設定する

先日、 OSC2019 Hiroshima で PostgreSQL の Explainを使って Indexを貼る前・貼った後の速度計測をする というデモの環境を構築しました。

その時、Localeの初期値が C じゃなかったので お? と思い、調べてみました。

結論を先に

POSTGRES_INITDB_ARGS に "--encoding=UTF-8 --locale=C" を設定する 

docker-compose.yml とかだと以下のように設定すると有効化されます。

version: "3.7"

services:
  postgres:
    image: postgres:11
    environment:
      POSTGRES_DB: osc_demo
      POSTGRES_USER: osc_user
      POSTGRES_PASSWORD: osc_pass
      POSTGRES_INITDB_ARGS: "--encoding=UTF-8 --locale=C"
    ports:
      - "5432:5432"
    volumes:
      - ./postgres/data:/var/lib/postgresql/data
      - ./postgres/work:/docker-entrypoint-initdb.d/
    container_name: osc_pgsql

ということで、以下は興味のある方向け〜。

課題

Dockerで自動で作られる データベースの デフォルトの Locale が C ではない。

Locale C、ja_JP.UTF-8、en_US.UTF-8の違いについては以下記事をご参照ください。

qiita.com

調査概要

Locale がデフォルトだと何になるか

osc_demo テーブルを作るように Docker に予め設定した状態で Docker で postgresql を立ち上げてみた。

# psql -U osc_user osc_demo
psql (11.5 (Debian 11.5-1.pgdg90+1))
Type "help" for help.

osc_demo=# \l
                                 List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges   
-----------+----------+----------+------------+------------+-----------------------
 osc_demo  | osc_user | UTF8     | en_US.utf8 | en_US.utf8 | 
 postgres  | osc_user | UTF8     | en_US.utf8 | en_US.utf8 | 
 template0 | osc_user | UTF8     | en_US.utf8 | en_US.utf8 | =c/osc_user          +
           |          |          |            |            | osc_user=CTc/osc_user
 template1 | osc_user | UTF8     | en_US.utf8 | en_US.utf8 | =c/osc_user          +
           |          |          |            |            | osc_user=CTc/osc_user
(4 rows)

未指定だと PostgreSQL の Locale は en_US.utf8 が設定される。

設定方法

POSTGRES_INITDB_ARGS に initdb にわたす時に必要な コマンドを渡す。

hub.docker.com

参考にしたのは上記ページ

How to extend this image

の所に記述があった。

通常の時(これは Linux等のサーバーに構築する時) はどうしてるかというのは 以下のページとかを読んだ。

https://www.kaisekisya.net/linux/postgresql/eleven.html

再度 調整..

※ 元々 - ./postgres/data:/var/lib/postgresql/data でマウントして 永続化を行っていたので ./postgres/data の下を削除して 予め初期化しておく。

# psql -U osc_user osc_demo
psql (11.5 (Debian 11.5-1.pgdg90+1))
Type "help" for help.

osc_demo=# \l
                             List of databases
   Name    |  Owner   | Encoding | Collate | Ctype |   Access privileges   
-----------+----------+----------+---------+-------+-----------------------
 osc_demo  | osc_user | UTF8     | C       | C     | 
 postgres  | osc_user | UTF8     | C       | C     | 
 template0 | osc_user | UTF8     | C       | C     | =c/osc_user          +
           |          |          |         |       | osc_user=CTc/osc_user
 template1 | osc_user | UTF8     | C       | C     | =c/osc_user          +
           |          |          |         |       | osc_user=CTc/osc_user
(4 rows)

Locale C が設定された \(^o^)/