如何在docker中为postgresql创建postgis扩展?

如何在docker中为postgresql创建postgis扩展?,postgresql,docker,postgis,Postgresql,Docker,Postgis,我在尝试创建postgis扩展时出错 下面是我的dockerfile的样子 from postgres RUN apt-get update && apt-get install postgis -y ADD /create_postgis_extension.sh /docker-entrypoint-initdb.d/ 创建。布拉布拉..嘘 #!/bin/sh POSTGRES="gosu postgres postgres" $POSTGRES --single

我在尝试创建postgis扩展时出错

下面是我的dockerfile的样子

    from postgres
RUN apt-get update && apt-get install postgis -y
ADD /create_postgis_extension.sh /docker-entrypoint-initdb.d/
创建。布拉布拉..嘘

#!/bin/sh
POSTGRES="gosu postgres postgres"

$POSTGRES --single -E <<EOSQL
CREATE EXTENSION postgis;
CREATE EXTENSION postgis_topology;
EOSQL
#/垃圾箱/垃圾箱
POSTGRES=“gosu POSTGRES POSTGRES”
$POSTGRES--single-E语句:创建扩展postgis_拓扑

后端>错误:未安装所需的扩展名“postgis”

我显然做错了什么,但我不知道是什么。
如果我使用apt get安装了postgis,为什么没有安装postgis。

我使用的是CentOS而不是Debian,但遇到了同样的问题。解决方案基本上归结为使用pg_ctl启动/停止postgres

sudo -u postgres pg_ctl start -w -D ${PGDATA}

sudo -u postgres createdb postgis_template -E UTF8
sudo -u postgres psql -d postgis_template -c "create extension if not exists postgis;"

sudo -u postgres pg_ctl stop -w

您可能为该postgres安装了错误版本的postgis?
addbang[]存在于2.1.0版,在2.0和2.1版之间存在一个问题。
RedHat家族由于其更新频率较低的行为(速度较慢的人…)而较少出现这些问题

话虽如此。
docker entrypoint initdb.d由docker-entrypoint.sh内部脚本管理,该脚本仅在PGDATA文件夹不存在时运行。
此初始化脚本能够管理一些文件:.sh、.sql和.sql.tar.gz。
这些都是由docker的用户按字母顺序执行的postgres

使用sql而不是使用sh来执行sql。
创建\u postgis\u extension.sql:

创建扩展(如果不存在);
如果不存在POSTGIS_拓扑,则创建扩展;
简洁

问候。

-DOCKERFILE

FROM postgres:12.4

RUN apt-get update \
    && apt-get install wget -y \
    && apt-get install postgresql-12-postgis-3 -y \
    && apt-get install postgis -y

COPY ./db.sql /docker-entrypoint-initdb.d/
---db.sql(在同一文件夹中)


Docker上的错误是否正在运行?如果没有,何时/如何调用脚本?记住,postgres只有在entrypoint/cmd脚本在运行时执行之后才会运行。另外,似乎其他人已经这样做了:谢谢你的评论。我使用了他们的一些脚本,但仍然不起作用。你能帮忙吗?在我看来,postgis/postgres的版本不兼容,但我对postgis一无所知,所以恐怕我帮不了什么忙。我注意到链接的项目使用了postgis和postgres的特定版本。不,它是postgis 2.1和postgresql 9.3。它应该能用。我需要在dockerfile中做这个。在建立形象时,这会起作用吗?是的。这正是我使用此解决方案的场景。
CREATE EXTENSION postgis;