カテゴリー
Linux

PostgreSQL の無難なロケールは “なし” (C) だと思うが、 Docker コンテナを使いたいときにロケールをなし (C) に設定する簡単な方法

まとめ

  • 起動時の環境変数 POSTGRES_INITDB_ARGS で設定することで、ロケールをなし (C) に設定可能
    • - POSTGRES_INITDB_ARGS=--encoding=UTF-8 --locale=C
    • POSTGRES_INITDB_ARGS: "--encoding=UTF-8 --locale=C" <= 注意。コッチっは試していない。
  • ちなみに、 docker run の場合は docker run --rm -it -e POSTGRES_PASSWORD=secret -e POSTGRES_INITDB_ARGS="--encoding=UTF-8 --locale=C" postgres:12.2 bash といった書式になる。

実践。指定する前

ロケールを何も指定しない場合です。

docker-compose.yml を抜粋すると次のように指定しています。

  db:
    image: postgres:12.2
    environment:
      - POSTGRES_PASSWORD=secret
      - POSTGRES_USER=laravel
      - POSTGRES_DB=laravel

このときのロケールは次のようになりました。 en_US.utf8 で、デフォルトの値です。

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

laravel=#

実践。指定した後

docker-compose.yml を次のように変更しました。

  db:
    image: postgres:12.2
    environment:
      - POSTGRES_PASSWORD=secret
      - POSTGRES_USER=laravel
      - POSTGRES_DB=laravel
      - POSTGRES_INITDB_ARGS=--encoding=UTF-8 --locale=C

ロケールがなし (C) になりました♪

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

laravel=#

注意点

指定したいのはロケールなのでエンコーディングを docker-compose.yml に指定しないとエンコーディングが SQL_ASCII に設定されてしまいます。そうではなく UTF8 に設定したいですので、ロケールだけでなく、エンコーディングも設定する必要がありました。

また、地味につまづいたのが、 yml の書き方でした。

正解は - POSTGRES_INITDB_ARGS=--encoding=UTF-8 --locale=C でした。

誤りだったのは、 - POSTGRES_INITDB_ARGS="--encoding=UTF-8 --locale=C" で、ダブルクォーテーションで囲む必要はありません。 ダブルクォーテーションは、ただの文字列として解釈される ためです。

実際に、ダブルクォーテーションで囲んで見ると、 docker のログで次のようなエラーとなってしまいました。

db_1   | The files belonging to this database system will be owned by user "postgres".
db_1   | This user must also own the server process.
db_1   |
db_1   | The database cluster will be initialized with locale "en_US.utf8".
db_1   | initdb: error: "UTF-8 --locale=C" is not a valid server encoding name

おわりに

PostgreSQL では無難なロケールはなんだろう? と疑問に思い調べており、次のページを答えとしました。

最終的な設定方法はシンプルなものですけれども、それに至るまでにぽかミスをして時間をとってしまいました><。

なお、ロケールを明確に指定したい場合は、 Dockerfile を作り記述するのが良いようです。

以上です。

コメントを残す