Я хочу создать пользовательские сценарии, которые будут создавать базу данных, подключаться к ней и инициализировать схему.Поэтому я создал следующие сценарии оболочки:
файл: 100_sample_create.sh
#!/bin/bash
mkdir -p /var/lib/postgresql/tablespaces/SAMPLECLIENT
mkdir -p /var/lib/postgresql/tablespaces/SAMPLEINDEX
set -e
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
CREATE ROLE SAMPLEOWNER;
CREATE USER SAMPLE WITH ENCRYPTED PASSWORD 'samplepwd';
GRANT SAMPLEOWNER TO SAMPLE;
CREATE TABLESPACE SAMPLECLIENT OWNER SAMPLEOWNER LOCATION '/var/lib/postgresql/tablespaces/SAMPLECLIENT';
CREATE TABLESPACE SAMPLEINDEX OWNER SAMPLEOWNER LOCATION '/var/lib/postgresql/tablespaces/SAMPLEINDEX';
CREATE DATABASE SAMPLE OWNER SAMPLEOWNER ENCODING 'UTF-8' TABLESPACE SAMPLECLIENT CONNECTION LIMIT -1;
EOSQL
файл: 110_sample_init.sh
#!/bin/bash
set -e
psql -v ON_ERROR_STOP=1 --username "SAMPLEOWNER" --dbname "SAMPLE" <<-EOSQL
CREATE SCHEMA SAMPLE;
ALTER SCHEMA SAMPLE OWNER TO SAMPLEOWNER;
ALTER DATABASE SAMPLE SET search_path TO SAMPLE;
ALTER ROLE SAMPLEOWNER SET search_path TO SAMPLE;
ALTER ROLE SAMPLEOWNER SET default_tablespace = SAMPLECLIENT;
GRANT ALL ON DATABASE SAMPLE TO SAMPLEOWNER;
GRANT ALL ON SCHEMA SAMPLE TO SAMPLEOWNER;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA SAMPLE TO SAMPLEOWNER;
EOSQL
файл docker-compose.yml
version: "3"
services:
sample-postgres:
image: "postgres:11"
container_name: "sample-postgres"
ports:
- "5432:5432"
environment:
- POSTGRES_PASSWORD=Password1.
volumes:
- ./100_sample_create.sh:/docker-entrypoint-initdb.d/100_sample_create.sh
- ./110_sample_init.sh:/docker-entrypoint-initdb.d/110_sample_init.sh
однако, когда я запускаю контейнер, я получаю следующую ошибку:
/usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/110_sample_init.sh
2019-05-22 13:56:05.603 UTC [72] FATAL: role "SAMPLEOWNER" does not exist
psql: FATAL: role "SAMPLEOWNER" does not exist
означает ли это, что пользователь был создан только в базе данных $POSTGRES_DB
и недоступен в SAMPLE
db?Как я должен изменить сценарии, чтобы правильно создать пользовательскую базу данных и инициализировать ее?Я знаю, что могу настроить имя db с помощью параметров докера, но я хочу сделать это с помощью сценариев, потому что мне нужно иметь больше баз данных внутри контейнера.