C 为Postgres 11结果创建扩展名;无法访问文件$libdir/…”;
我试着举一个简单的例子。因此,我创建了一个包含四个文件的文件夹addme。Makerfile看起来像:C 为Postgres 11结果创建扩展名;无法访问文件$libdir/…”;,c,postgresql,docker,C,Postgresql,Docker,我试着举一个简单的例子。因此,我创建了一个包含四个文件的文件夹addme。Makerfile看起来像: MODULES = addme EXTENSION = addme DATA = addme--0.0.1.sql PG_CONFIG = pg_config PGXS := $(shell $(PG_CONFIG) --pgxs) include $(PGXS) CREATE OR REPLACE FUNCTION addme(int, int) RETURNS int AS 'MODU
MODULES = addme
EXTENSION = addme
DATA = addme--0.0.1.sql
PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)
CREATE OR REPLACE FUNCTION
addme(int, int) RETURNS int AS 'MODULE_PATHNAME','addme'
LANGUAGE C STRICT;
addme.control文件看起来像
comment = 'Simple number add function'
default_version = '0.0.1'
relocatable = true
module_pathname = '$libdir/addme'
addme.c非常简单,如下所示:
#include "postgres.h"
#include "fmgr.h"
PG_MODULE_MAGIC;
PG_FUNCTION_INFO_V1(addme);
Datum addme(PG_FUNCTION_ARGS)
{
int32 arg1 = PG_GETARG_INT32(0);
int32 arg2 = PG_GETARG_INT32(1);
PG_RETURN_INT32(arg1 + arg2);
}
最后,addme--0.0.1.sql如下所示:
MODULES = addme
EXTENSION = addme
DATA = addme--0.0.1.sql
PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)
CREATE OR REPLACE FUNCTION
addme(int, int) RETURNS int AS 'MODULE_PATHNAME','addme'
LANGUAGE C STRICT;
在docker内部,我安装了Postgres 11以及所有必要的库和依赖项:
FROM ubuntu:latest
....
....
RUN ... apt-get install -y postgresql-11 postgresql-client-11 postgresql-contrib-11
postgresql server dev all
和postgresql common
也已安装。路径设置如下:
ENV PATH="/usr/lib/postgresql/11/bin:${PATH}"
此外,我编译addme
扩展如下:
RUN cd /usr/src/addme && \
make clean && make PG_CONFIG=/usr/bin/pg_config && make install PG_CONFIG=/usr/bin/pg_config && \
cp ./addme.control /usr/share/postgresql/11/extension/addme.control && \
cp ./addme--0.0.1.sql /usr/share/postgresql/11/extension/addme--0.0.1.sql && \
cp ./addme.o /usr/lib/x86_64-linux-gnu/addme.o && \
cp ./addme.so /usr/lib/x86_64-linux-gnu/addme.so
一切看起来都很好。我构建并运行容器,我看到Postgres正在工作,我可以列出它的数据库等等。但是,当我尝试创建扩展名addme
时,我得到了一个错误。这是docker shell内部的完整堆栈跟踪:
[root@localhost ~]# docker exec -it 7e9f9c331351 /bin/bash
root@7e9f9c331351:/# su postgres
postgres@7e9f9c331351:/$ psql
psql (11.6 (Ubuntu 11.6-1.pgdg18.04+1))
Type "help" for help.
postgres=# \c test
You are now connected to database "test" as user "postgres".
test=# create extension addme;
ERROR: could not access file "$libdir/addme": No such file or directory
test=# \q
postgres@7e9f9c331351:/$ pg_config --libdir
/usr/lib/x86_64-linux-gnu
postgres@7e9f9c331351:/$ ls /usr/src/addme
addme--0.0.1.sql addme.bc addme.c addme.control addme.o addme.so Makefile
postgres@7e9f9c331351:/$ cd /usr/share/postgresql/11/extension/
postgres@7e9f9c331351:/usr/share/postgresql/11/extension$ find . -name "addme*"
./addme--0.0.1.sql
./addme.control
如您所见,它找不到“$libdir/addme”。但关键是$libdir是/usr/lib/x86_64-linux-gnu
和addme.o
和addme。那么,这有什么问题,我该如何解决?非常感谢
附:这是我的Dockerfile:
FROM ubuntu:latest
ENV OS_LOCALE="en_US.UTF-8" \
DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y locales && locale-gen ${OS_LOCALE}
ENV LANG=${OS_LOCALE} \
LANGUAGE=${OS_LOCALE} \
LC_ALL=${OS_LOCALE} \
PG_VERSION=11 \
PG_USER=postgres \
PG_HOME=/var/lib/postgresql \
PG_RUN_DIR=/run/postgresql \
PG_LOG_DIR=/var/log/postgresql \
PATH="/usr/lib/postgresql/11/bin:${PATH}"
ENV PG_CONF_DIR="/etc/postgresql/${PG_VERSION}/main" \
PG_BIN_DIR="/usr/lib/postgresql/${PG_VERSION}/bin" \
PG_DATA_DIR="${PG_HOME}/${PG_VERSION}/main"
# Install basic libraries
RUN apt-get update && \
apt-get -y install gcc \
libprotobuf-dev protobuf-compiler \
git build-essential \
wget checkinstall zlib1g-dev \
make automake autoconf cmake
# Install Postgresql
RUN dpkg-reconfigure locales && apt-get install -y sudo gnupg \
&& wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \
&& echo 'deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main' > /etc/apt/sources.list.d/pgdg.list \
&& apt-get update && apt-get install -y postgresql-${PG_VERSION} postgresql-client-${PG_VERSION} postgresql-contrib-${PG_VERSION} lbzip2 \
# Cleaning
&& apt-get purge -y --auto-remove gnupg \
&& rm -rf ${PG_HOME} \
&& rm -rf /var/lib/apt/lists/* \
&& touch /tmp/.EMPTY_DB
COPY entrypoint.sh /sbin/entrypoint.sh
RUN chmod 755 /sbin/entrypoint.sh
# Install Postgresql Rabbitmq extension
RUN apt-get update && apt-get install -y --no-install-recommends \
python-psycopg2 libpq-dev \
postgresql-server-dev-all postgresql-common && \
mkdir /usr/src/addme
COPY ./addme /usr/src/addme
#RUN cd /usr/src/addme && \
# make clean && make PG_CONFIG=/usr/bin/pg_config && make install PG_CONFIG=/usr/bin/pg_config && \
# cp ./addme.control /usr/share/postgresql/11/extension/addme.control && \
# cp ./addme--0.0.1.sql /usr/share/postgresql/11/extension/addme--0.0.1.sql && \
# cp ./addme.o /usr/lib/x86_64-linux-gnu/addme.o && \
# cp ./addme.so /usr/lib/x86_64-linux-gnu/addme.so
RUN cd /usr/src/addme && \
make && make install
EXPOSE 5432/tcp
VOLUME ["${PG_HOME}", "${PG_RUN_DIR}"]
CMD ["/sbin/entrypoint.sh"]
它使用entrypoint.sh,这是我从中获取的。我使用Docker-compose.yml构建并运行Docker:
version: '3.7'
services:
postgres_db:
build: ./Database
environment:
- DB_USER=test
- DB_NAME=test
- DB_PASS=test
restart: always
ports:
- "5432:5432"
volumes:
- "./postgres-data:/var/lib/postgresql"
因此,我的文件夹结构最终看起来是这样的:
- docker-compose.yml
- 数据库
- Dockerfile
- entrypoint.sh
- 地址
- addme--0.0.1.sql
- 地址c
- 地址控制
- 生成文件
您将共享库添加到了错误的位置
它应该安装在PostgreSQL库目录中,而不是安装在/usr/lib/x86_64-linux-gnu
中。PostgreSQL库目录可以通过
pg_config --libdir
可能是/usr/share/postgresql/11/lib
为避免此类问题,建议您使用makeinstall
而不是手动复制文件。请查看Docker shell的我的日志。我在那里运行pg\u config--libdir
,它返回/usr/lib/x86\u 64-linux-gnu
,然后您调用了错误的pg\u config
。尝试/usr/lib/postgresql/11/bin/pg_config
。我将执行简单的进行安装
,并将向您报告。我想我也用这种方式尝试过,并得到了其他错误消息,比如addme.control
找不到等。我刚刚尝试过/usr/lib/postgresql/11/bin/pg_config
,它返回了相同的/usr/lib/x86_64-linux-gnu
,实际上,我可以提供完整的Dockerfile文件,完全复制所有错误。