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 映像页面上的部分,其中描述了初始化脚本。您也可以研究一下这一点。