#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.