Skip to content

Commit a1cfb32

Browse files
author
Ricco Xie
committed
feat: 更新 Dockerfile 以支持 Pig 环境管理器
1 parent 47208d1 commit a1cfb32

5 files changed

Lines changed: 295 additions & 69 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
# 更新日志
2+
3+
## 20250929 - 使用 Pig 包管理器重构
4+
5+
### 新增功能
6+
7+
- **Pig 包管理器集成**:使用 [Pig](https://pig.pgsty.com/zh/start/) 统一管理 PostgreSQL 内核和扩展
8+
- **简化构建过程**:移除复杂的手动编译步骤
9+
- **多架构支持**:自动处理不同 CPU 架构的兼容性
10+
- **容错安装**:智能处理安装失败的情况
11+
- **环境管理**:通过 Pig 自动配置 PostgreSQL 运行环境
12+
13+
### 主要变化
14+
15+
#### 🔧 Dockerfile 重构
16+
17+
- **之前**:手动下载、编译 SCWS 库和 zhparser 扩展
18+
- **现在**:使用 Pig 包管理器统一管理 PostgreSQL 内核和扩展(基于 Ubuntu 24.04)
19+
- **优势**:构建时间更短,维护更简单,环境更统一,使用最新的 Ubuntu LTS
20+
21+
#### 📦 环境管理优化
22+
23+
- **统一管理**:PostgreSQL 内核和扩展都通过 Pig 包管理器管理
24+
- **自动依赖**:Pig 自动处理内核和扩展的依赖关系
25+
- **版本控制**:支持 PostgreSQL 内核和扩展的版本管理
26+
- **环境配置**:自动配置 PostgreSQL 运行环境
27+
28+
#### 🗂️ 项目结构简化
29+
30+
- **删除文件**:移除复杂的配置文件和多余脚本
31+
- **保留核心**:只保留必要的构建和初始化文件
32+
- **清晰结构**:项目文件结构更加简洁明了
33+
34+
### 技术改进
35+
36+
#### 构建过程
37+
38+
```dockerfile
39+
# 新的构建方式
40+
RUN curl -fsSL https://repo.pigsty.io/pig | bash
41+
RUN pig repo add all -u
42+
RUN pig ext install pg16
43+
RUN pig ext install pg_trgm hstore btree_gist pg_stat_statements unaccent
44+
RUN pig ext install zhparser || echo "zhparser not available for this architecture"
45+
```
46+
47+
#### 扩展管理
48+
49+
```bash
50+
# 查看已安装扩展
51+
docker exec -it postgres-zh pig ext list
52+
53+
# 安装新扩展
54+
docker exec -it postgres-zh pig ext install <extension_name>
55+
56+
# 更新扩展
57+
docker exec -it postgres-zh pig ext update <extension_name>
58+
59+
# 搜索可用扩展
60+
docker exec -it postgres-zh pig ext search <extension_name>
61+
```
62+
63+
### 兼容性说明
64+
65+
| 架构 | PostgreSQL | zhparser | 其他扩展 | 状态 |
66+
|------|------------|----------|----------|------|
67+
| linux/amd64 | ✅ 完整支持 | ✅ 完整支持 | ✅ 完整支持 | 🟢 推荐 |
68+
| linux/arm64 | ✅ 完整支持 | ✅ 完整支持 | ✅ 完整支持 | 🟢 推荐 |
69+
| linux/386 | ✅ 完整支持 | ⚠️ 部分支持 | ✅ 完整支持 | 🟡 可用 |
70+
| linux/arm/v7 | ✅ 完整支持 | ⚠️ 部分支持 | ✅ 完整支持 | 🟡 可用 |
71+
| linux/ppc64le | ✅ 完整支持 | ⚠️ 部分支持 | ✅ 完整支持 | 🟡 可用 |
72+
| linux/s390x | ✅ 完整支持 | ⚠️ 部分支持 | ✅ 完整支持 | 🟡 可用 |
73+
74+
### 迁移指南
75+
76+
#### 从旧版本升级
77+
78+
1. 更新 Dockerfile 以使用新的构建方式
79+
2. 移除手动编译相关的构建步骤
80+
3. 使用 Pig 命令管理扩展
81+
82+
#### 使用方法
83+
84+
```bash
85+
# 构建镜像
86+
docker build -t riccoxie/postgres-zh .
87+
88+
# 测试构建
89+
./test-pig-build.sh
90+
91+
# 运行容器
92+
docker run -d --name postgres-zh -e POSTGRES_PASSWORD=your_password -p 5432:5432 riccoxie/postgres-zh
93+
```
94+
95+
### 优势总结
96+
97+
- **🎯 简化维护**:统一的 PostgreSQL 环境管理,减少手动配置
98+
- **🔒 提高可靠性**:自动处理内核和扩展依赖关系,减少构建失败
99+
- **⚡ 增强灵活性**:支持动态内核和扩展安装更新
100+
- **🛡️ 更好的错误处理**:智能回退机制,提高构建成功率
101+
- **📦 标准化管理**:使用业界标准的 Pig 包管理器
102+
- **🌍 环境统一**:通过 Pig 实现 PostgreSQL 内核和扩展的统一管理
103+
104+
---
105+
106+
## 20250928 - 初始版本
107+
108+
### 🎉 项目创建
109+
110+
- 基于 PostgreSQL 16 的 Docker 镜像
111+
- 支持中文全文搜索功能
112+
- 集成 zhparser 中文分词器
113+
- 多架构支持(7 种 CPU 架构)
114+
- 预装常用 PostgreSQL 扩展

‎Dockerfile‎

Lines changed: 69 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,50 @@
1-
# 基于官方PostgreSQL 16镜像
2-
FROM postgres:16
1+
# 基于 Ubuntu 基础镜像
2+
FROM ubuntu:24.04
33

4-
# 切换为root用户执行安装操作
5-
USER root
4+
# 设置环境变量
5+
ENV DEBIAN_FRONTEND=noninteractive
6+
ENV POSTGRES_VERSION=16
67

7-
# 安装依赖包
8+
# 安装基础依赖包
89
RUN apt-get update && apt-get install -y --no-install-recommends \
910
apt-transport-https \
10-
bzip2 \
1111
ca-certificates \
1212
curl \
13-
gcc \
14-
libc6-dev \
15-
make \
13+
gnupg \
14+
lsb-release \
1615
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") \
16+
sudo \
17+
systemd \
3118
&& rm -rf /var/lib/apt/lists/*
3219

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
40-
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
59-
60-
# 注意:pg_jieba 已移除,因为 zhparser 已经提供了完整的中文分词功能
61-
# 如果需要结巴分词功能,可以单独安装 pg_jieba 扩展
62-
63-
# 安装其他常用扩展包
20+
# 安装 Pig 包管理器
21+
RUN curl -fsSL https://repo.pigsty.io/pig | bash
22+
23+
# 配置 Pig 仓库(添加所有必要的仓库)
24+
RUN pig repo add all -u
25+
26+
# 使用 Pig 安装 PostgreSQL 16 内核
27+
RUN pig ext install pg16
28+
29+
# 使用 Pig 安装 PostgreSQL 扩展
30+
RUN pig ext install pg_trgm hstore btree_gist pg_stat_statements unaccent
31+
32+
# 尝试安装中文分词扩展(如果可用)
33+
RUN pig ext install zhparser || echo "zhparser not available for this architecture, skipping..."
34+
35+
# 安装其他常用扩展
36+
RUN pig ext install postgresql-contrib || echo "postgresql-contrib not available via pig, using apt..."
37+
38+
# 如果 Pig 无法安装某些扩展,回退到 apt 安装
6439
RUN apt-get update && apt-get install -y --no-install-recommends \
6540
postgresql-contrib \
66-
&& rm -rf /var/lib/apt/lists/*
41+
&& rm -rf /var/lib/apt/lists/* || echo "Some extensions may not be available for this architecture"
42+
43+
# 创建 postgres 用户和组
44+
RUN groupadd -r postgres --gid=999 && useradd -r -g postgres --uid=999 postgres
45+
46+
# 创建 PostgreSQL 数据目录
47+
RUN mkdir -p /var/lib/postgresql/data && chown -R postgres:postgres /var/lib/postgresql
6748

6849
# 复制初始化脚本到容器中
6950
COPY init-scripts/ /docker-entrypoint-initdb.d/
@@ -72,5 +53,38 @@ COPY init-scripts/ /docker-entrypoint-initdb.d/
7253
RUN chmod -R 755 /docker-entrypoint-initdb.d/ && \
7354
chown -R postgres:postgres /docker-entrypoint-initdb.d/
7455

56+
# 设置环境变量
57+
ENV PGDATA=/var/lib/postgresql/data
58+
ENV POSTGRES_USER=postgres
59+
ENV POSTGRES_PASSWORD=postgres
60+
ENV POSTGRES_DB=postgres
61+
62+
# 暴露端口
63+
EXPOSE 5432
64+
65+
# 创建启动脚本
66+
RUN echo '#!/bin/bash\n\
67+
set -e\n\
68+
\n\
69+
# 初始化数据库(如果不存在)\n\
70+
if [ ! -s "$PGDATA/PG_VERSION" ]; then\n\
71+
echo "Initializing database..."\n\
72+
su-exec postgres initdb\n\
73+
echo "host all all 0.0.0.0/0 md5" >> $PGDATA/pg_hba.conf\n\
74+
echo "listen_addresses = '\''*'\''" >> $PGDATA/postgresql.conf\n\
75+
fi\n\
76+
\n\
77+
# 启动 PostgreSQL\n\
78+
echo "Starting PostgreSQL..."\n\
79+
su-exec postgres postgres "$@"\n\
80+
' > /usr/local/bin/docker-entrypoint.sh && chmod +x /usr/local/bin/docker-entrypoint.sh
81+
82+
# 安装 su-exec
83+
RUN apt-get update && apt-get install -y su-exec && rm -rf /var/lib/apt/lists/*
84+
7585
# 切换回postgres用户
7686
USER postgres
87+
88+
# 设置启动命令
89+
ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]
90+
CMD ["postgres"]

‎README.md‎

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,13 @@
1818

1919
### 🚀 核心功能
2020

21-
- **PostgreSQL 16**: 基于官方 PostgreSQL 16 镜像
21+
- **PostgreSQL 16**: 基于 Ubuntu 24.04 和 Pig 包管理器
2222
- **多架构支持**: 支持 7 种不同的 CPU 架构
2323
- **中文分词支持**: 集成 zhparser 中文分词器
2424
- **全文搜索**: 支持中文全文搜索和模糊匹配
2525
- **扩展丰富**: 预装常用 PostgreSQL 扩展
2626
- **容错构建**: 智能处理不同架构的包兼容性问题
27+
- **Pig 环境管理**: 使用 Pig 包管理器统一管理 PostgreSQL 内核和扩展
2728

2829
### 📦 预装扩展
2930

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

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

222248
```bash
223249
# 运行开发环境
224250
docker run -it --rm \
225251
-e POSTGRES_PASSWORD=dev_password \
226252
-p 5432:5432 \
227-
-v $(pwd)/script:/docker-entrypoint-initdb.d \
253+
-v $(pwd)/init-scripts:/docker-entrypoint-initdb.d \
228254
riccoxie/postgres-zh:v16
229255
```
230256

@@ -253,7 +279,7 @@ SET pg_trgm.similarity_threshold = 0.3;
253279

254280
### 功能可用性
255281

256-
不同架构的功能可用性可能有所不同:
282+
不同架构的功能可用性可能有所不同(基于 Pig 包管理器):
257283

258284
| 架构 | PostgreSQL | zhparser | 其他扩展 | 状态 |
259285
|------|------------|----------|----------|------|
@@ -267,8 +293,8 @@ SET pg_trgm.similarity_threshold = 0.3;
267293

268294
### 说明
269295

270-
- **🟢 推荐**: 完整功能支持,最佳性能
271-
- **🟡 可用**: 核心功能完整,部分高级功能可能受限
296+
- **🟢 推荐**: 完整功能支持,最佳性能(Pig 包管理器完全支持)
297+
- **🟡 可用**: 核心功能完整,部分高级功能可能受限(Pig 包管理器部分支持)
272298
- **⚠️ 部分支持**: zhparser 在某些架构上可能无法编译,但 PostgreSQL 核心功能完全可用
273299

274300
## 故障排除

‎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

0 commit comments

Comments
 (0)