项目场景:
docker-compose.yml
version: "3"
services:
postgres:
image: postgres:11.6
container_name: postgres
restart: always
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: 123456
ports:
- 5432:5432
volumes:
- /tmp/postgresql:/var/lib/postgresql/data
使用docker进行部署postgres,直接使用官方镜像进行启动。
问题描述:
碰到字段排序,中文字符未按照预期排序。查看发现官网镜像默认系统是Debian,系统字符集是:en_US.utf8
, 查看日志postgres进行初始化时默认使用:
postgres | The database cluster will be initialized with locale “en_US.utf8”.
postgres | The default database encoding has accordingly been set to “UTF8”.
postgres | The default text search configuration will be set to “english”.
创建数据库默认使用template1,查看发现其Collate和Ctype都是en_US.utf8
。所以考虑可以创建数据库时可自定义配置:
create database test03 encoding 'UTF8' lc_collate 'zh_CN.utf8' lc_ctype 'zh_CN.utf8' template template0;
但是此时发现并没有zh_CN.utf8
,进到容器中执行locale -a
发现系统中确实没zh_CN.utf8
,所以需要安装执行dpkg-reconfigure locales
,选择zh_CN.utf8
和en_US.utf8
,然后此时就可以正常使用中文排序了。但是此时还有两个问题:
- 一旦重新创建新的容器问题依旧
- 创建数据库时若使用默认不指定则问题也存在
而且查询资料发现此数据库的Collate和Ctype一旦创建不可修改,所以换种思路打包自己的镜像,上传到私服使用。
解决方案:
build镜像,自定义Locale ,将默认语言环境设置为zh_CN.utf8
:
Dockerfile:
FROM postgres:11.6
RUN localedef -i zh_CN -c -f UTF-8 -A /usr/share/locale/locale.alias zh_CN.UTF-8
ENV LANG zh_CN.utf8
打包镜像:
docker build -t tuine/postgres .
更改docker-compose.yml,image: tuine/postgres
,然后进行启动docker-compose up
发现日志输出变成了中文,所有默认都改为了zh_CN.utf8
,此时中文排序也按预期进行了。完美!