PostgreSQLのDockerコンテナのLocaleをCにする

# What's？

PostgreSQLのDockerコンテナを使う時に、意識していないとLocale（というかcollateとctype）が`en_US.utf8`になっていたので`C`にしたいなということで。

ソートなどで気にすることになりますよね。

# 環境

```shell
$ docker version
Client: Docker Engine - Community
 Version:           27.5.1
 API version:       1.47
 Go version:        go1.22.11
 Git commit:        9f9e405
 Built:             Wed Jan 22 13:42:47 2025
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          27.5.1
  API version:      1.47 (minimum version 1.24)
  Go version:       go1.22.11
  Git commit:       4c9b3b0
  Built:            Wed Jan 22 13:41:09 2025
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.7.25
  GitCommit:        bcc810d6b9066471b0b6fa75f557a15a1cbf31bb
 runc:
  Version:          1.2.4
  GitCommit:        v1.2.4-0-g6c52b3f
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
```

# なにも指定しない場合

特になにも指定せず、PostgreSQLのDockerコンテナを起動します。

```shell
$ docker container run -it --rm --name postgres \
  -e POSTGRES_PASSWORD=xxxxx \
  postgres:17.2-bookworm
```

この時の結果。

```shell
$ docker container exec -it postgres psql -U postgres -l
                                                    List of databases
   Name    |  Owner   | Encoding | Locale Provider |  Collate   |   Ctype    | Locale | ICU Rules |   Access privileges
-----------+----------+----------+-----------------+------------+------------+--------+-----------+-----------------------
 postgres  | postgres | UTF8     | libc            | en_US.utf8 | en_US.utf8 |        |           |
 template0 | postgres | UTF8     | libc            | en_US.utf8 | en_US.utf8 |        |           | =c/postgres          +
           |          |          |                 |            |            |        |           | postgres=CTc/postgres
 template1 | postgres | UTF8     | libc            | en_US.utf8 | en_US.utf8 |        |           | =c/postgres          +
           |          |          |                 |            |            |        |           | postgres=CTc/postgres
(3 rows)

```

`Collate`と`CType`が`en_US.utf8`になっています。

これを変えたいというのが今回のお題です。

# POSTGRES_INITDB_ARGS環境変数を指定する

この挙動を変えるには`initdb`時の指定を変更することになりますが、これを行うのが`POSTGRES_INITDB_ARGS`環境変数です。

> This optional environment variable can be used to send arguments to postgres initdb. The value is a space separated string of arguments as postgres initdb would expect them. This is useful for adding functionality like data page checksums: -e POSTGRES_INITDB_ARGS="--data-checksums".

[DockerHub / postgres](https://hub.docker.com/_/postgres)

`C`にするには、次のどちらかでしょうね。

```shell
$ docker container run -it --rm --name postgres \
  -e POSTGRES_PASSWORD=xxxxx \
  -e POSTGRES_INITDB_ARGS=--no-locale \
  postgres:17.2-bookworm


$ docker container run -it --rm --name postgres \
  -e POSTGRES_PASSWORD=xxxxx \
  -e POSTGRES_INITDB_ARGS=--locale=C \
  postgres:17.2-bookworm
```


結果は、どちらも以下になります。

```shell
$ docker container exec -it postgres psql -U postgres -l
                                                 List of databases
   Name    |  Owner   | Encoding  | Locale Provider | Collate | Ctype | Locale | ICU Rules |   Access privileges
-----------+----------+-----------+-----------------+---------+-------+--------+-----------+-----------------------
 postgres  | postgres | SQL_ASCII | libc            | C       | C     |        |           |
 template0 | postgres | SQL_ASCII | libc            | C       | C     |        |           | =c/postgres          +
           |          |           |                 |         |       |        |           | postgres=CTc/postgres
 template1 | postgres | SQL_ASCII | libc            | C       | C     |        |           | =c/postgres          +
           |          |           |                 |         |       |        |           | postgres=CTc/postgres
(3 rows)

```

おや、`Encoding`が`SQL_ASCII`ですね。

ではこうでしょうか。

```shell
$ docker container run -it --rm --name postgres \
  -e POSTGRES_PASSWORD=xxxxx \
  -e POSTGRES_INITDB_ARGS='--encoding=UTF-8 --no-locale' \
  postgres:17.2-bookworm


$ docker container run -it --rm --name postgres \
  -e POSTGRES_PASSWORD=xxxxx \
  -e POSTGRES_INITDB_ARGS='--encoding=UTF-8 --locale=C' \
  postgres:17.2-bookworm
```

今度はこうなりました。

```shell
$ docker container exec -it postgres psql -U postgres -l
                                                List of databases
   Name    |  Owner   | Encoding | Locale Provider | Collate | Ctype | Locale | ICU Rules |   Access privileges
-----------+----------+----------+-----------------+---------+-------+--------+-----------+-----------------------
 postgres  | postgres | UTF8     | libc            | C       | C     |        |           |
 template0 | postgres | UTF8     | libc            | C       | C     |        |           | =c/postgres          +
           |          |          |                 |         |       |        |           | postgres=CTc/postgres
 template1 | postgres | UTF8     | libc            | C       | C     |        |           | =c/postgres          +
           |          |          |                 |         |       |        |           | postgres=CTc/postgres
(3 rows)

```