Docker PostgreSQL 将数据库编码更改为 UTF-8

Phi*_*ipp 4 postgresql docker docker-compose

我想通过 docker-compose 运行一个 postgres 容器,该容器具有 COLLATE 和 CTYPE 'C' 以及数据库编码 'UTF-8'。但这看起来是不可能的。

这是 docker-compose.yml 上的部分:

database:
    image: postgres:latest
    volumes:
        - db:/var/lib/postgresql/data
    environment:
        POSTGRES_PASSWORD: test
        LC_COLLATE: C
        LC_CTYPE: C
        LANG: C.UTF-8
Run Code Online (Sandbox Code Playgroud)

这是日志输出:

The database cluster will be initialized with locales.
The default text search configuration will be set to "english".
  COLLATE:  C
  CTYPE:    C
  MESSAGES: C.UTF-8
  MONETARY: C.UTF-8
  NUMERIC:  C.UTF-8
  TIME:     C.UTF-8
The default database encoding has accordingly been set to "SQL_ASCII".
Run Code Online (Sandbox Code Playgroud)

我必须将数据库编码设置为 UTF-8,并将 COLLATE 和 CTYPE 设置为“C”而不是“C.UTF-8”,否则从属应用程序将无法连接。

我在任何文档或其他任何地方都没有找到任何内容。

小智 6

您需要在这里连接两块拼图:

https://www.postgresql.org/docs/9.5/app-initdb.html

initdb,教你如何将编码信息传递给数据库创建函数。

postgres 官方 Docker 镜像指出您可以将选项传递给 initdb:

https://hub.docker.com/_/postgres

因此,答案会是这样的:

database:
    image: postgres:latest
    volumes:
        - db:/var/lib/postgresql/data
    environment:
        POSTGRES_PASSWORD: test
        POSTGRES_INITDB_ARGS: '--encoding=UTF-8 --lc-collate=C --lc-ctype=C'
Run Code Online (Sandbox Code Playgroud)

或者类似的论点。我忽略了 lang 选项,因为这不是手册页上的官方“将此标志传递给 postgres”选项(我包含的第一个链接)。

我的测试没有使用 docker compose 运行它,而是使用 -e 选项在命令行上运行。然而,这是完全相同的概念;docker compose 中的“环境”在命令行中是 -e 。以机智:

https://docs.docker.com/engine/reference/commandline/run/

--env , -e 设置环境变量

仅使用密码 env 集测试#1:

docker run -e POSTGRES_PASSWORD=test postgres:latest
Run Code Online (Sandbox Code Playgroud)

这是默认运行的输出:

postgres@cbf23636dabc:~$ psql
psql (13.4 (Debian 13.4-1.pgdg100+1))
Type "help" for help.

postgres=# \l
                                 List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges   
-----------+----------+----------+------------+------------+-----------------------
 postgres  | postgres | UTF8     | en_US.utf8 | en_US.utf8 | 
 template0 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
Run Code Online (Sandbox Code Playgroud)

测试 #2,仅在 CLI 上使用建议的 docker compose 中的环境变量设置,如上所示:

docker run -e POSTGRES_PASSWORD=test -e POSTGRES_INITDB_ARGS='--encoding=UTF-8 --lc-collate=C --lc-ctype=C' postgres:latest
Run Code Online (Sandbox Code Playgroud)

然后输出:

postgres@b6b80c876f3e:~$ psql 
psql (13.4 (Debian 13.4-1.pgdg100+1))
Type "help" for help.

postgres=# \l
                             List of databases
   Name    |  Owner   | Encoding | Collate | Ctype |   Access privileges   
-----------+----------+----------+---------+-------+-----------------------
 postgres  | postgres | UTF8     | C       | C     | 
 template0 | postgres | UTF8     | C       | C     | =c/postgres          +
           |          |          |         |       | postgres=CTc/postgres
 template1 | postgres | UTF8     | C       | C     | =c/postgres          +
           |          |          |         |       | postgres=CTc/postgres
Run Code Online (Sandbox Code Playgroud)

另请注意,官方 Postgresql Docker 映像页面上的部分,其中描述了初始化脚本。您也可以研究一下这一点。