在 postgres 容器中,导入的扩展位于何处?

in a postgres container, where are the imported extensions located?

我想在该目录上创建一个卷,并引入 plpython 和 postgis 扩展。

出于某种原因,我无法从容器中创建扩展。

我曾尝试 运行 通过使用本地版本并连接到 postgres 容器,因为本地版本具有扩展...但无济于事。 \dx 什么都不显示。

我知道在 /usr/share/postgresql/14/extension 我可以找到 plpython3u.control

其中有以下内容:

# plpython3u extension
comment = 'PL/Python3U untrusted procedural language'
default_version = '1.0'
module_pathname = '$libdir/plpython3'
relocatable = false
schema = pg_catalog
superuser = true

但我找不到它指的是什么...

我的错误,在我进入容器并制作该文件后:

CREATE EXTENSION plpython3u;
FATAL:  extension "plpython3u" has no installation script nor update path for version "1.0"
server closed the connection unexpectedly
        This probably means the server terminated abnormally
        before or while processing the request.
The connection to the server was lost. Attempting reset: Succeeded.

Postgres 扩展作为共享库模块 (.so) 文件实现,通常位于 /usr/lib/postgresql/14/lib 中。因此,例如,plpgsql 扩展名 (/usr/share/postgresql/14/extension/plpgsql.control) 的控制文件如下所示:

# plpgsql extension
comment = 'PL/pgSQL procedural language'
default_version = '1.0'
module_pathname = '$libdir/plpgsql'
relocatable = false
schema = pg_catalog
superuser = true
trusted = true

module_pathname值中,$libdir指的是/usr/lib/postgresql/14/lib,我们在其中找到/usr/lib/postgresql/14/lib/plpgsql.so.


如果你想启用一个新的扩展,比如 plpython3u,你需要控制和 sql 文件以及共享库(需要为 Postgres 版本构建你是 运行).

幸运的是,plpython 扩展似乎已经打包并可以使用库存 postgres 图像进行安装。以下 Dockerfile 将生成安装了 plpython 扩展的图像:

FROM postgres:14

RUN apt-get update && \
    apt-get -y install postgresql-plpython3-14 && \
    apt-get clean all

如果我们从那个 Dockerfile 构建图像:

docker build -t postgres-plpython .

然后启动一个容器:

docker run -d --name postgres -e POSTGRES_PASSWORD=secret postgres-plpython

我们可以 docker exec 到容器中并将扩展名添加到 数据库:

$ docker exec -it postgres psql -U postgres
psql (14.3 (Debian 14.3-1.pgdg110+1))
Type "help" for help.

postgres=# create extension plpython3u;
CREATE EXTENSION