Skip to content

Commit 2c6baec

Browse files
author
Ricco Xie
committed
feat: 更新 Dockerfile 以支持 Pig 环境管理器, 添加多种扩展, 仅支持平台linux/amd64,linux/arm64
1 parent 47208d1 commit 2c6baec

6 files changed

Lines changed: 576 additions & 93 deletions

File tree

‎.github/workflows/docker-build.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ jobs:
5252
uses: docker/build-push-action@v5
5353
with:
5454
context: .
55-
platforms: linux/386,linux/amd64,linux/arm/v7,linux/arm/v5,linux/arm64,linux/ppc64le,linux/s390x
55+
platforms: linux/amd64,linux/arm64
5656
push: ${{ github.event_name != 'pull_request' }}
5757
tags: ${{ steps.meta.outputs.tags }}
5858
labels: ${{ steps.meta.outputs.labels }}

‎CHANGELOG.md‎

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

‎Dockerfile‎

Lines changed: 117 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,72 @@
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
20+
# 安装 Pig 包管理器
21+
RUN curl -fsSL https://repo.pigsty.io/pig | bash
22+
23+
# 配置 Pig 仓库(分别添加仓库以避免冲突)
24+
RUN yes | pig repo add pigsty pgdg -u
25+
26+
# 使用 Pig 安装 PostgreSQL 16 内核
27+
RUN pig ext install pg16 -y
28+
29+
# 创建 /usr/pgsql 软链接,并写入 /etc/profile.d/pgsql.sh
30+
RUN pig ext link 16
31+
# 立即生效
32+
RUN . /etc/profile.d/pgsql.sh
33+
34+
# 使用 Pig 安装 数据类型 扩展
35+
RUN pig ext install hstore ltree -y
36+
37+
# 使用 Pig 安装 时间序列 扩展
38+
RUN pig ext install timescaledb timescaledb_toolkit -y
39+
40+
# 使用 Pig 安装 地理位置 扩展
41+
RUN pig ext install postgis geoip -y
42+
43+
# 使用 Pig 安装 AI/向量 扩展
44+
RUN pig ext install pg_similarity smlar vchord pgvector pg_vectorize -y
45+
46+
# 使用 Pig 安装 FTS 扩展
47+
RUN pig ext install pg_trgm pg_bigm fuzzystrmatch pgroonga vchord_bm25 pg_search pg_tokenizer zhparser unaccent -y
48+
49+
# 使用 Pig 安装 索引 扩展
50+
RUN pig ext install btree_gist -y
4051

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-
# 安装其他常用扩展包
52+
# 使用 Pig 安装 分析能力 扩展
53+
RUN pig ext install pg_analytics pg_partman pg_duckdb citus tablefunc -y
54+
55+
# 使用 Pig 安装 能力 扩展
56+
RUN pig ext install pg_jsonschema pg_graphql uuid-ossp pg_cron pg_audit pg_stat_statements -y
57+
58+
# 安装 postgresql-contrib 包(包含额外的扩展)
6459
RUN apt-get update && apt-get install -y --no-install-recommends \
6560
postgresql-contrib \
66-
&& rm -rf /var/lib/apt/lists/*
61+
&& rm -rf /var/lib/apt/lists/* || echo "postgresql-contrib not available for this architecture"
62+
63+
# 检查 postgres 用户是否存在,如果不存在则创建
64+
RUN if ! id postgres >/dev/null 2>&1; then \
65+
groupadd -r postgres --gid=999 && useradd -r -g postgres --uid=999 postgres; \
66+
fi
67+
68+
# 创建 PostgreSQL 数据目录
69+
RUN mkdir -p /var/lib/postgresql/data && chown -R postgres:postgres /var/lib/postgresql
6770

6871
# 复制初始化脚本到容器中
6972
COPY init-scripts/ /docker-entrypoint-initdb.d/
@@ -72,5 +75,65 @@ COPY init-scripts/ /docker-entrypoint-initdb.d/
7275
RUN chmod -R 755 /docker-entrypoint-initdb.d/ && \
7376
chown -R postgres:postgres /docker-entrypoint-initdb.d/
7477

78+
# 设置环境变量
79+
ENV PGDATA=/var/lib/postgresql/data
80+
ENV POSTGRES_USER=postgres
81+
ENV POSTGRES_DB=postgres
82+
83+
# 暴露端口
84+
EXPOSE 5432
85+
86+
# 创建启动脚本
87+
RUN echo '#!/bin/bash\n\
88+
set -e\n\
89+
\n\
90+
# 设置默认值(如果未提供)\n\
91+
if [ -z "$POSTGRES_USER" ]; then\n\
92+
export POSTGRES_USER=postgres\n\
93+
fi\n\
94+
if [ -z "$POSTGRES_PASSWORD" ]; then\n\
95+
export POSTGRES_PASSWORD=postgres\n\
96+
fi\n\
97+
if [ -z "$POSTGRES_DB" ]; then\n\
98+
export POSTGRES_DB=postgres\n\
99+
fi\n\
100+
\n\
101+
# 初始化数据库(如果不存在)\n\
102+
if [ ! -s "$PGDATA/PG_VERSION" ]; then\n\
103+
echo "Initializing database..."\n\
104+
/usr/pgsql/bin/initdb\n\
105+
echo "host all all 0.0.0.0/0 md5" >> $PGDATA/pg_hba.conf\n\
106+
echo "listen_addresses = '\''*'\''" >> $PGDATA/postgresql.conf\n\
107+
\n\
108+
# 启动 PostgreSQL 并设置用户、密码和创建数据库\n\
109+
/usr/pgsql/bin/postgres &\n\
110+
sleep 5\n\
111+
\n\
112+
# 如果用户不是默认的 postgres,创建新用户\n\
113+
if [ "$POSTGRES_USER" != "postgres" ]; then\n\
114+
/usr/pgsql/bin/psql -c "CREATE USER $POSTGRES_USER WITH SUPERUSER PASSWORD '\''$POSTGRES_PASSWORD'\'';"\n\
115+
else\n\
116+
/usr/pgsql/bin/psql -c "ALTER USER postgres PASSWORD '\''$POSTGRES_PASSWORD'\'';"\n\
117+
fi\n\
118+
\n\
119+
# 创建指定的数据库\n\
120+
if [ "$POSTGRES_DB" != "postgres" ]; then\n\
121+
/usr/pgsql/bin/createdb -U postgres -O $POSTGRES_USER "$POSTGRES_DB"\n\
122+
fi\n\
123+
\n\
124+
kill %1\n\
125+
wait\n\
126+
fi\n\
127+
\n\
128+
# 启动 PostgreSQL\n\
129+
echo "Starting PostgreSQL..."\n\
130+
exec /usr/pgsql/bin/postgres\n\
131+
' > /usr/local/bin/docker-entrypoint.sh && chmod +x /usr/local/bin/docker-entrypoint.sh
132+
133+
# 不需要安装额外的包,直接使用系统自带的 su 命令
134+
75135
# 切换回postgres用户
76136
USER postgres
137+
138+
# 设置启动命令
139+
ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]

0 commit comments

Comments
 (0)