Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为Postgres 11结果创建扩展名;无法访问文件$libdir/…”;_C_Postgresql_Docker - Fatal编程技术网

C 为Postgres 11结果创建扩展名;无法访问文件$libdir/…”;

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

我试着举一个简单的例子。因此,我创建了一个包含四个文件的文件夹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 '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文件,完全复制所有错误。