Не Удается Заставить Изображение PostGIS Работать Как Локальные Файлы Вместо Этого

#docker #docker-compose

Вопрос:

Общая цель: Мне нужна Postgis с расширением pg_trgm.

Подход: Измените три файла, необходимые для изображения postgis.

Проблема: я не могу заставить точно такие же файлы работать с моей настройкой, т. Е. до внесения изменений в сценарии bash для дополнительного расширения.

Изначально у меня было это, которое работает.

 version: '3.7'

services:

    postgres:
        image: postgis/postgis
        ports:
            - 5432:5432
        environment:
            - POSTGRES_DB=dspace
            - POSTGRES_USER=dspace
        env_file:
            - proj.env
        volumes:
            - postgres_data:/var/lib/postgresql/data/
        command: ["postgres", "-c", "log_statement=all"]
        network_mode: "host"

volumes:
    postgres_data:
 

Чтобы получить дополнительное расширение, я решил создать три файла, которые являются частью изображения postgis (источник — https://github.com/postgis/docker-postgis/tree/master/13-3.1), и сделали скрипты bash исполняемыми —

pg-Докерфайл:

 FROM postgres:13

LABEL maintainer="PostGIS Project - https://postgis.net"

ENV POSTGIS_MAJOR 3
ENV POSTGIS_VERSION 3.1.2 dfsg-1~exp2.pgdg100 1

RUN apt-get update 
      amp;amp; apt-cache showpkg postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR 
      amp;amp; apt-get install -y --no-install-recommends 
           postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR=$POSTGIS_VERSION 
           postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR-scripts=$POSTGIS_VERSION 
      amp;amp; rm -rf /var/lib/apt/lists/*

RUN mkdir -p /docker-entrypoint-initdb.d
COPY ./initdb-postgis.sh /docker-entrypoint-initdb.d/10_postgis.sh
COPY ./update-postgis.sh /usr/local/bin
 

initdb-postgis.sh:

 #!/bin/sh

set -e

# Perform all actions as $POSTGRES_USER
export PGUSER="$POSTGRES_USER"

# Create the 'template_postgis' template db
"${psql[@]}" <<- 'EOSQL'
CREATE DATABASE template_postgis IS_TEMPLATE true;
EOSQL

# Load PostGIS into both template_database and $POSTGRES_DB
for DB in template_postgis "$POSTGRES_DB"; do
    echo "Loading PostGIS extensions into $DB"
    "${psql[@]}" --dbname="$DB" <<-'EOSQL'
        CREATE EXTENSION IF NOT EXISTS postgis;
        CREATE EXTENSION IF NOT EXISTS postgis_topology;
        CREATE EXTENSION IF NOT EXISTS fuzzystrmatch;
        CREATE EXTENSION IF NOT EXISTS postgis_tiger_geocoder;
EOSQL
done
 

update-postgis.sh:

 #!/bin/sh

set -e

# Perform all actions as $POSTGRES_USER
export PGUSER="$POSTGRES_USER"

POSTGIS_VERSION="${POSTGIS_VERSION%% *}"

# Load PostGIS into both template_database and $POSTGRES_DB
for DB in template_postgis "$POSTGRES_DB" "${@}"; do
    echo "Updating PostGIS extensions '$DB' to $POSTGIS_VERSION"
    psql --dbname="$DB" -c "
        -- Upgrade PostGIS (includes raster)
        CREATE EXTENSION IF NOT EXISTS postgis VERSION '$POSTGIS_VERSION';
        ALTER EXTENSION postgis  UPDATE TO '$POSTGIS_VERSION';
        -- Upgrade Topology
        CREATE EXTENSION IF NOT EXISTS postgis_topology VERSION '$POSTGIS_VERSION';
        ALTER EXTENSION postgis_topology UPDATE TO '$POSTGIS_VERSION';
        -- Install Tiger dependencies in case not already installed
        CREATE EXTENSION IF NOT EXISTS fuzzystrmatch;
        -- Upgrade US Tiger Geocoder
        CREATE EXTENSION IF NOT EXISTS postgis_tiger_geocoder VERSION '$POSTGIS_VERSION';
        ALTER EXTENSION postgis_tiger_geocoder UPDATE TO '$POSTGIS_VERSION';
    "
done
 

Each of these three files is within the same directory which contain the docker-compose.yml file.

The docker-compose.yml is now this —

 version: '3.7'

services:

    postgres:
        # image: postgis/postgis
        build:
            context: .
            dockerfile: pg-Dockerfile
        ports:
            - 5432:5432
        environment:
            - POSTGRES_DB=dspace
            - POSTGRES_USER=dspace
        env_file:
            - proj.env
        volumes:
            - postgres_data:/var/lib/postgresql/data/
        command: ["postgres", "-c", "log_statement=all"]
        network_mode: "host"

volumes:
    postgres_data:
 

This is the error per the logs —

 postgres_1  | /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/10_postgis.sh
postgres_1  | /docker-entrypoint-initdb.d/10_postgis.sh: 9: /docker-entrypoint-initdb.d/10_postgis.sh: Bad substitution
 

It must be something silly but I don’t understand. Thanks in advance.