如何通过docker-compose设置PostgreSQL的locale为en_GB?
问题根因
配置不生效主要有两个核心原因:
- PostgreSQL的默认locale配置仅在数据库集群首次初始化时生效,你本地已挂载的
pg-data持久卷保留了首次初始化时的默认en_US配置,后续修改镜像、环境变量都不会覆盖旧集群的配置 - 仅设置
LANG环境变量不会覆盖PostgreSQL专门用于货币格式的lc_monetary参数,money类型的显示逻辑由该参数单独控制
修复步骤
方式一:重新初始化数据库集群(适用于还没有业务数据的场景)
- 先停止运行的容器并清空旧持久卷(执行前请确认已有数据可清除,有需要先备份数据)
docker compose down -v
- 你当前的Dockerfile无需修改,已经可以正确生成
en_GB.UTF-8locale - 修改
docker-compose.yml中db服务的environment配置,新增初始化参数:
environment: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} PGDATA: ${PGDATA} LANG: 'en_GB.UTF-8' # 初始化数据库集群时指定全局locale和货币格式 POSTGRES_INITDB_ARGS: "--locale=en_GB.UTF-8 --lc-monetary=en_GB.UTF-8"
- 重新构建并启动容器
docker compose up --build -d
- 验证配置生效:连接到PostgreSQL执行以下SQL,返回
en_GB.UTF-8即配置正确
show lc_monetary;
方式二:修改已有集群配置(适用于已有业务数据不能清空的场景)
不需要修改镜像和docker-compose配置,直接连接到PostgreSQL执行以下SQL修改全局参数,之后重启数据库服务即可生效:
ALTER SYSTEM SET lc_monetary = 'en_GB.UTF-8';
该配置修改后仅对新建立的连接生效,不会修改已存储的money类型字段的数值,仅修改其显示格式。
内容的提问来源于stack exchange,提问作者Robert Jamborski
相关产品推荐
相关产品推荐

