Postgresql 11 Docker создать пользовательскую базу данных - PullRequest
1 голос
/ 22 мая 2019

Я хочу создать пользовательские сценарии, которые будут создавать базу данных, подключаться к ней и инициализировать схему.Поэтому я создал следующие сценарии оболочки:

файл: 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 с помощью параметров докера, но я хочу сделать это с помощью сценариев, потому что мне нужно иметь больше баз данных внутри контейнера.

1 Ответ

0 голосов
/ 22 мая 2019

Используемая вами команда:

CREATE ROLE SAMPLEOWNER; 

создает роль с именем sampleowner (все в нижнем регистре).Если вы действительно хотите, чтобы он был в верхнем регистре, используйте:

CREATE ROLE "SAMPLEOWNER";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...