diff --git a/backend/Dockerfile.postgres b/backend/Dockerfile.postgres index d92d35b..e5869ad 100644 --- a/backend/Dockerfile.postgres +++ b/backend/Dockerfile.postgres @@ -1,27 +1,34 @@ -# Postgres 16 + zhparser 中文分词扩展 -# 基础镜像从 alpine 切到 debian bookworm,为了 apt 能装 postgresql-16-zhparser -# alpine 仓库没打包 zhparser,只能从源码编,代价不值 -# -# 构建: docker build -f backend/Dockerfile.postgres -t diary-postgres:zh ./backend -# 配合 docker-compose.yml 改 postgres 服务的 build 字段使用 FROM postgres:16-bookworm -# 装 zhparser + scws(scws 是 zhparser 依赖的分词库) -# postgresql-16-zhparser 包会同时拉 libscws 等依赖 -# bookworm 仓库里有现成二进制包,免编译 -RUN apt-get update \ - && apt-get install -y --no-install-recommends \ - postgresql-16-zhparser \ +# 装 zhparser 编译依赖 + scws(中文分词库) +# zhparser 在 PGDG / Debian 仓库里都没现成包,需要从源码编译 +# 参考: https://github.com/zhparser/zhparser +RUN set -eux; \ + apt-get update; \ + apt-get install -y --no-install-recommends \ + build-essential \ + git \ ca-certificates \ - && rm -rf /var/lib/apt/lists/* + # scws 依赖 + libscws-dev \ + # pg_config / pgxs(编译 PG 扩展用,来自 postgresql-server-dev) + postgresql-server-dev-16; \ + rm -rf /var/lib/apt/lists/* -# 注意: -# 1) zhparser 扩展本身不需要 postgresql.conf 改 shared_preload_libraries -# (那是 pg_stat_statements / pg_cron 之类才需要) -# 2) 扩展是建在 database 里的(用 CREATE EXTENSION zhparser;),不是 initdb 时装 -# 所以不需要改 entrypoint,迁移里 CREATE EXTENSION 即可 -# 3) 如果将来升级 PG 大版本,zhparser 包名会跟着变(postgresql-XX-zhparser) -# Dockerfile 写死版本号,升级时要改 +# 装 scws 命令行工具(可选,扩展本身只需要 libscws.so) +# Debian 包 libscws-dev 已经包含了运行时 .so -# 默认继承 postgres:16-bookworm 的 entrypoint / cmd -# 数据 volume 复用 pg_data,数据兼容(只是多了个 extension) +# 编译装 zhparser +# 注意:zhparser 默认要装到 $pkglibdir(/usr/lib/postgresql/16/lib/), +# make install 用 PGXS 系统,会读取 pg_config +RUN set -eux; \ + cd /tmp; \ + git clone --depth 1 https://github.com/zhparser/zhparser.git; \ + cd zhparser; \ + make; \ + make install; \ + cd /; \ + rm -rf /tmp/zhparser + +# 验证:扩展文件应该已经就位 +RUN ls -la /usr/lib/postgresql/16/lib/zhparser.so 2>&1 | head -2