项目需要 PostgreSQL 带上中文分词(zhparser)、向量搜索(pgvector)和分布式(Citus)这些扩展。
官方镜像啥都没有,每次手动装太蛋疼了。干脆写个 Dockerfile 一把梭,多阶段构建,编译完扩展复制到干净的镜像里。
启动容器后记得手动执行 CREATE EXTENSION 来启用需要的插件。
Dockerfile
# 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
| # 第一阶段:构建扩展
FROM postgres:16 AS builder
# 安装构建工具和依赖
RUN apt-get update && apt-get install -y \
postgresql-server-dev-16 \
build-essential \
git \
curl \
wget \
bzip2 \
libcurl4-openssl-dev \
&& rm -rf /var/lib/apt/lists/*
# 安装 SCWS
RUN wget -q -O - http://www.xunsearch.com/scws/down/scws-1.2.3.tar.bz2 | tar -xjf - \
&& cd scws-1.2.3 \
&& ./configure \
&& make install \
&& rm -rf /scws-1.2.3
# 安装 pgvector 扩展
RUN git clone https://github.com/pgvector/pgvector.git /tmp/pgvector \
&& cd /tmp/pgvector \
&& make && make install \
&& rm -rf /tmp/pgvector
# 安装 zhparser 扩展
RUN git clone https://github.com/amutu/zhparser.git /tmp/zhparser \
&& cd /tmp/zhparser \
&& make && make install \
&& rm -rf /tmp/zhparser
# 添加 Citus 的官方仓库并安装 Citus
RUN curl https://install.citusdata.com/community/deb.sh > add-citus-repo.sh \
&& bash add-citus-repo.sh \
&& apt-get -y install postgresql-16-citus-12.1 \
&& rm -rf /var/lib/apt/lists/*
# 第二阶段:创建最终镜像
FROM postgres:16
# 安装 libcurl 以确保 Citus 扩展可以找到所需的库
RUN apt-get update && apt-get install -y \
libcurl4 \
&& rm -rf /var/lib/apt/lists/*
# 从构建阶段复制已安装的扩展和 SCWS 库
COPY --from=builder /usr/lib/postgresql/16/lib/ /usr/lib/postgresql/16/lib/
COPY --from=builder /usr/share/postgresql/16/extension/ /usr/share/postgresql/16/extension/
COPY --from=builder /usr/local/lib/libscws.* /usr/local/lib/
COPY --from=builder /usr/share/postgresql/16/extension/zhparser* /usr/share/postgresql/16/extension/
COPY --from=builder /usr/lib/postgresql/16/lib/bitcode/zhparser* /usr/lib/postgresql/16/lib/bitcode/
COPY --from=builder /usr/share/postgresql/16/tsearch_data/ /usr/share/postgresql/16/tsearch_data/
COPY --from=builder /var/lib/postgresql/data/base/ /var/lib/postgresql/data/base/
# 设置环境变量
ENV POSTGRES_USER=${DB_ROOT_USER:-db_user}
ENV POSTGRES_PASSWORD=${DB_ROOT_PASSWORD:-db_password}
# 设置 Citus 为 shared_preload_libraries
RUN echo "shared_preload_libraries = 'citus'" >> /usr/share/postgresql/postgresql.conf.sample
# 优化 PostgreSQL 性能
RUN echo "shared_buffers = 256MB" >> /usr/share/postgresql/postgresql.conf.sample \
&& echo "work_mem = 4MB" >> /usr/share/postgresql/postgresql.conf.sample \
&& echo "maintenance_work_mem = 64MB" >> /usr/share/postgresql/postgresql.conf.sample \
&& echo "effective_cache_size = 512MB" >> /usr/share/postgresql/postgresql.conf.sample \
&& echo "max_connections = 200" >> /usr/share/postgresql/postgresql.conf.sample
# 请自己执行启用插件
# CREATE EXTENSION vector
# CREATE EXTENSION citext
# CREATE EXTENSION zhparser
# CREATE EXTENSION citus
# Select * FROM pg_extension
|