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+ # 安装基础依赖包
89RUN 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 包(包含额外的扩展)
6459RUN 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# 复制初始化脚本到容器中
6972COPY init-scripts/ /docker-entrypoint-initdb.d/
@@ -72,5 +75,65 @@ COPY init-scripts/ /docker-entrypoint-initdb.d/
7275RUN 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用户
76136USER postgres
137+
138+ # 设置启动命令
139+ ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh" ]
0 commit comments