まとめ
- 起動時の環境変数
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"
で、ダブルクォーテーションで囲む必要はありません。 ダブルクォーテーションは、ただの文字列として解釈される ためです。
- Declare default environment variables in file | Docker Documentation
There is no special handling of quotation marks. This means that they are part of the VAL.
- Multiple arguments in POSTGRES_INITDB_ARGS · Issue #622 · docker-library/postgres
実際に、ダブルクォーテーションで囲んで見ると、 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 を作り記述するのが良いようです。
- postgres – Docker Hub の Locale Customization
以上です。