Skip to content

Commit a9f5192

Browse files
author
Ricco Xie
committed
feat: 更新 Dockerfile 以支持 Pig 包管理器,添加扩展安装和中文分词功能测试脚本,更新 README.md 以反映新特性
1 parent 47208d1 commit a9f5192

4 files changed

Lines changed: 123 additions & 58 deletions

File tree

‎Dockerfile‎

Lines changed: 17 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -4,66 +4,34 @@ FROM postgres:16
44
# 切换为root用户执行安装操作
55
USER root
66

7-
# 安装依赖包
7+
# 安装基础依赖包
88
RUN apt-get update && apt-get install -y --no-install-recommends \
99
apt-transport-https \
10-
bzip2 \
1110
ca-certificates \
1211
curl \
13-
gcc \
14-
libc6-dev \
15-
make \
16-
wget \
17-
unzip \
18-
cmake \
19-
openssl \
20-
clang \
21-
&& rm -rf /var/lib/apt/lists/* \
22-
&& update-ca-certificates
23-
24-
# 安装 PostgreSQL 开发包(容错安装)
25-
RUN apt-get update && apt-get install -y --no-install-recommends \
26-
libpq-dev \
27-
&& (apt-get install -y postgresql-server-dev-16 || \
28-
apt-get install -y postgresql-server-dev-all || \
29-
apt-get install -y postgresql-server-dev || \
30-
echo "PostgreSQL server dev packages not available for this architecture") \
12+
gnupg \
13+
lsb-release \
3114
&& rm -rf /var/lib/apt/lists/*
3215

33-
# 验证 PostgreSQL 开发包是否安装成功
34-
RUN if [ ! -f "/usr/include/postgresql/16/server/postgres.h" ]; then \
35-
echo "PostgreSQL headers not found, trying alternative installation..."; \
36-
apt-get update && apt-get install -y --no-install-recommends \
37-
postgresql-server-dev-16 || \
38-
echo "Failed to install PostgreSQL development headers"; \
39-
fi
16+
# 安装 Pig 包管理器
17+
RUN curl -fsSL https://repo.pigsty.cc/get | bash
18+
19+
# 配置 Pig 仓库
20+
RUN pig repo add all
4021

41-
# 安装SCWS库和zhparser扩展(使用官方发布版本)
42-
RUN wget -q -O - "http://www.xunsearch.com/scws/down/scws-1.2.3.tar.bz2" | tar xjf - && \
43-
ZHPARSER_URL="https://github.com/amutu/zhparser/archive/master.tar.gz" && \
44-
curl -sSkLf "${ZHPARSER_URL}" | tar xzf - && \
45-
cd scws-1.2.3 && \
46-
./configure && \
47-
make -j$(nproc) install V=0 && \
48-
ldconfig && \
49-
cd /zhparser-master && \
50-
# 检查 PostgreSQL 头文件是否存在
51-
if [ -f "/usr/include/postgresql/16/server/postgres.h" ]; then \
52-
echo "PostgreSQL headers found, proceeding with zhparser compilation..."; \
53-
make -j$(nproc) install; \
54-
else \
55-
echo "PostgreSQL headers not found, skipping zhparser compilation..."; \
56-
echo "zhparser will not be available in this build"; \
57-
fi && \
58-
rm -rf /scws-1.2.3 /zhparser-master
22+
# 使用 Pig 安装 PostgreSQL 扩展
23+
RUN pig install pg_trgm hstore btree_gist pg_stat_statements unaccent
5924

60-
# 注意:pg_jieba 已移除,因为 zhparser 已经提供了完整的中文分词功能
61-
# 如果需要结巴分词功能,可以单独安装 pg_jieba 扩展
25+
# 尝试安装中文分词扩展(如果可用)
26+
RUN pig install zhparser || echo "zhparser not available for this architecture, skipping..."
6227

63-
# 安装其他常用扩展包
28+
# 安装其他常用扩展
29+
RUN pig install postgresql-contrib || echo "postgresql-contrib not available via pig, using apt..."
30+
31+
# 如果 Pig 无法安装某些扩展,回退到 apt 安装
6432
RUN apt-get update && apt-get install -y --no-install-recommends \
6533
postgresql-contrib \
66-
&& rm -rf /var/lib/apt/lists/*
34+
&& rm -rf /var/lib/apt/lists/* || echo "Some extensions may not be available for this architecture"
6735

6836
# 复制初始化脚本到容器中
6937
COPY init-scripts/ /docker-entrypoint-initdb.d/

‎README.md‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
- **全文搜索**: 支持中文全文搜索和模糊匹配
2525
- **扩展丰富**: 预装常用 PostgreSQL 扩展
2626
- **容错构建**: 智能处理不同架构的包兼容性问题
27+
- **Pig 包管理**: 使用 Pig 包管理器统一管理 PostgreSQL 扩展
2728

2829
### 📦 预装扩展
2930

@@ -217,6 +218,30 @@ cd docker-postgres-zh
217218
docker build -t riccoxie/postgres-zh .
218219
```
219220

221+
### Pig 包管理器
222+
223+
本镜像使用 [Pig](https://repo.pigsty.cc/) 作为 PostgreSQL 扩展的包管理器,提供以下优势:
224+
225+
- **统一管理**: 通过 Pig 统一管理所有 PostgreSQL 扩展
226+
- **多架构支持**: 自动处理不同架构的扩展兼容性
227+
- **容错安装**: 智能处理扩展安装失败的情况
228+
229+
#### 扩展管理
230+
231+
```bash
232+
# 查看已安装的扩展
233+
docker exec -it postgres-zh pig list
234+
235+
# 安装新扩展
236+
docker exec -it postgres-zh pig install <extension_name>
237+
238+
# 更新扩展
239+
docker exec -it postgres-zh pig update <extension_name>
240+
241+
# 查看已安装的扩展
242+
docker exec -it postgres-zh pig list
243+
```
244+
220245
### 本地开发
221246

222247
```bash

‎init-scripts/01-extensions.sql‎

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,48 @@
1-
-- 启用核心扩展
1+
-- 使用 Pig 包管理器管理的扩展初始化脚本
2+
-- 此脚本会在 PostgreSQL 启动时自动执行
3+
4+
-- 启用核心扩展(通过 Pig 安装)
25
CREATE EXTENSION IF NOT EXISTS pg_trgm;
36
CREATE EXTENSION IF NOT EXISTS hstore;
47
CREATE EXTENSION IF NOT EXISTS btree_gist;
58
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
69
CREATE EXTENSION IF NOT EXISTS unaccent;
710

8-
-- 启用中文分词扩展
9-
CREATE EXTENSION IF NOT EXISTS zhparser;
11+
-- 启用中文分词扩展(如果通过 Pig 安装成功)
12+
-- 使用容错方式处理,避免在某些架构上失败
13+
DO $$
14+
BEGIN
15+
-- 尝试创建 zhparser 扩展
16+
BEGIN
17+
CREATE EXTENSION IF NOT EXISTS zhparser;
18+
19+
-- 为zhparser创建中文全文搜索配置
20+
-- 包含常用的中文词性:名词、动词、形容词、习语、叹词、习用语、简称、时间词
21+
IF NOT EXISTS (SELECT 1 FROM pg_ts_config WHERE cfgname = 'chinese_zh') THEN
22+
CREATE TEXT SEARCH CONFIGURATION chinese_zh (PARSER = zhparser);
23+
ALTER TEXT SEARCH CONFIGURATION chinese_zh ADD MAPPING FOR n,v,a,i,e,l,j,t WITH simple;
24+
END IF;
25+
26+
RAISE NOTICE 'zhparser extension and chinese_zh configuration created successfully';
27+
EXCEPTION
28+
WHEN OTHERS THEN
29+
RAISE NOTICE 'zhparser extension not available for this architecture: %', SQLERRM;
30+
END;
31+
END $$;
1032

11-
-- 为zhparser创建中文全文搜索配置
12-
-- 包含常用的中文词性:名词、动词、形容词、习语、叹词、习用语、简称、时间词
33+
-- 显示已安装的扩展信息
1334
DO $$
35+
DECLARE
36+
ext_record RECORD;
1437
BEGIN
15-
IF NOT EXISTS (SELECT 1 FROM pg_ts_config WHERE cfgname = 'chinese_zh') THEN
16-
CREATE TEXT SEARCH CONFIGURATION chinese_zh (PARSER = zhparser);
17-
ALTER TEXT SEARCH CONFIGURATION chinese_zh ADD MAPPING FOR n,v,a,i,e,l,j,t WITH simple;
18-
END IF;
38+
RAISE NOTICE '=== PostgreSQL Extensions Status ===';
39+
FOR ext_record IN
40+
SELECT extname, extversion
41+
FROM pg_extension
42+
ORDER BY extname
43+
LOOP
44+
RAISE NOTICE 'Extension: % (version: %)', ext_record.extname, ext_record.extversion;
45+
END LOOP;
46+
RAISE NOTICE '================================';
1947
END $$;
2048

‎test-pig-build.sh‎

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#!/bin/bash
2+
3+
# 测试 Pig 包管理器构建的脚本
4+
5+
set -e
6+
7+
echo "=== 测试 Pig 包管理器构建 ==="
8+
9+
# 构建镜像
10+
echo "构建 Docker 镜像..."
11+
docker build -t postgres-zh-pig-test .
12+
13+
# 启动容器
14+
echo "启动测试容器..."
15+
docker run -d \
16+
--name postgres-zh-pig-test \
17+
-e POSTGRES_PASSWORD=test_password \
18+
-e POSTGRES_DB=test_db \
19+
postgres-zh-pig-test
20+
21+
# 等待 PostgreSQL 启动
22+
echo "等待 PostgreSQL 启动..."
23+
sleep 10
24+
25+
# 测试 Pig 包管理器
26+
echo "测试 Pig 包管理器..."
27+
docker exec postgres-zh-pig-test pig list
28+
29+
# 测试扩展安装
30+
echo "测试扩展状态..."
31+
docker exec postgres-zh-pig-test psql -U postgres -d test_db -c "\dx"
32+
33+
# 测试中文分词功能
34+
echo "测试中文分词功能..."
35+
docker exec postgres-zh-pig-test psql -U postgres -d test_db -c "
36+
SELECT to_tsvector('chinese_zh', '这是一个中文分词的测试');
37+
"
38+
39+
# 清理
40+
echo "清理测试容器..."
41+
docker stop postgres-zh-pig-test
42+
docker rm postgres-zh-pig-test
43+
44+
echo "=== 测试完成 ==="

0 commit comments

Comments
 (0)