Postgresql 11 Docker создает пользовательскую базу данных

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

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

Из документации: «Вы должны иметь привилегию CREATEROLE или быть суперпользователем базы данных, чтобы использовать эту команду», вы являетесь суперпользователем или имеете привилегию? postgresql.org/docs/11/sql-createrole.html

Schwarz54 22.05.2019 16:14

к какой проблеме ваш комментарий? Роль SAMPLEOWNER должна быть создана, так как ошибки при выполнении не было.

bilak 22.05.2019 16:16
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
2
591
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Команда, которую вы использовали:

CREATE ROLE SAMPLEOWNER; 

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

CREATE ROLE "SAMPLEOWNER";

спасибо, дополнительно нужно было добавить LOGIN в сценарий создания роли SAMPLEOWNER.

bilak 22.05.2019 19:57

Да, поскольку он создается как роль, по умолчанию у него не будет прав входа в систему. Если вы замените слово ROLE на USER, он получит эти привилегии по умолчанию (это единственная разница между двумя командами).

Jeremy 22.05.2019 20:10

Другие вопросы по теме