如何通过Docker安装PostgreSQL的gzip扩展?
解决PostgreSQL Docker容器中gzip扩展无法加载的问题
问题描述
使用以下Dockerfile构建PostgreSQL 14镜像并启动容器后,执行CREATE EXTENSION gzip命令时报错:
SQL Error [58P01]: ERROR: could not open extension control file "/usr/share/postgresql/14/extension/gzip.control": No such file or directory
原Dockerfile内容:
FROM postgres:14.0 ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && \ apt-get install -y \ build-essential \ zlib1g-dev \ pkg-config \ git \ mc \ && echo "2" | apt-get install -y postgresql-server-dev-all \ && rm -rf /var/lib/apt/lists/* RUN git clone https://github.com/pramsey/pgsql-gzip.git \ && cd pgsql-gzip \ && make \ && make install
解决方案
修正Dockerfile,确保扩展文件安装到PostgreSQL 14对应的extension目录,以下两种方式均可:
方式一:指定PG_CONFIG路径编译安装
在make和make install时指定容器内PostgreSQL 14的pg_config路径,让安装脚本自动将文件放到正确目录:
FROM postgres:14.0 ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && \ apt-get install -y \ build-essential \ zlib1g-dev \ pkg-config \ git \ mc \ && echo "2" | apt-get install -y postgresql-server-dev-all \ && rm -rf /var/lib/apt/lists/* RUN git clone https://github.com/pramsey/pgsql-gzip.git \ && cd pgsql-gzip \ && PG_CONFIG=/usr/lib/postgresql/14/bin/pg_config make \ && PG_CONFIG=/usr/lib/postgresql/14/bin/pg_config make install
方式二:手动复制扩展文件到目标目录
如果方式一无效,可手动将编译生成的扩展文件复制到PostgreSQL 14的extension目录:
FROM postgres:14.0 ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && \ apt-get install -y \ build-essential \ zlib1g-dev \ pkg-config \ git \ mc \ && echo "2" | apt-get install -y postgresql-server-dev-all \ && rm -rf /var/lib/apt/lists/* RUN git clone https://github.com/pramsey/pgsql-gzip.git \ && cd pgsql-gzip \ && make \ && make install \ && cp gzip.control /usr/share/postgresql/14/extension/ \ && cp gzip--1.0.sql /usr/share/postgresql/14/extension/
原因说明
PostgreSQL加载扩展时,会在对应主版本的extension目录(如14版本为/usr/share/postgresql/14/extension)寻找.control文件。原Dockerfile中默认的make install未指定PostgreSQL版本路径,导致扩展文件被安装到了通用目录而非14版本的专属目录,因此执行CREATE EXTENSION时无法找到文件。
内容的提问来源于stack exchange,提问作者egeo
相关产品推荐
相关产品推荐

