@khristoforov

Как создать несколько БД и пользователей к ним Docker compose?

Коллеги добрый день, подскажите кто сталкивался с такой потребностью:
version: "3.9"
services:
  postgres:
    image: postgres:13.3
    environment:
      POSTGRES_DB: "habrdb"
      POSTGRES_USER: "habrpguser"
      POSTGRES_PASSWORD: "pgpwd4habr"
    volumes:
      - .:/docker-entrypoint-initdb.d
    ports:
      - "5432:5432"

В примере в разделе environment мы создаем БД habrdb пользователя для этой бд habrpguser и назначаем пароль этому пользователю pgpwd4habr. С этим вопросов нет , но что если мне нужно создать например не одну бд а 3 и зоздать 3х пользователей каждый соответствует своей бд соответственно и пароли , опять же не совсем понятно с базой по умолчанию какой на ней пароль тогда или она просто не заводится? Как будет выглядеть ямл в случае с такими требованиями:
БД Пользователь Пароль
postgres postgres rootpwd
test user userpwd
test1 user1 userpwd1
test2 user2 userpwd2
  • Вопрос задан
  • 667 просмотров
Решения вопроса 1
@khristoforov Автор вопроса
Итак всем большое спасибо за то что помогли разобраться. Решение для потомства:
Опишу все с путями.
1) Создаем папки
mkdir /opt/docker_postgres
mkdir /opt/docker_postgres/postgres_data
2) Переходим в нее и создаем файлы
cd /opt/docker_postgres
touch init-database.sh
touch docker-compose.yml
3) Редактируем docker-compose.yml
nano docker-compose.yml
version: "3.9"
services:
  postgres:
    image: postgres:latest
    restart: always
    container_name: postgres
    environment:
      POSTGRES_PASSWORD: "123pwd"
      MAX_CONNECTION: 200
      PGDATA: "/var/lib/postgresql/data/pgdata"
    ports:
      - "5432:5432"
    volumes:
      - type: bind
        source: /opt/docker_postgres/postgres_data
        target: /var/lib/postgresql/data/
    volumes:
        - ./init-database.sh:/docker-entrypoint-initdb.d/init-database.sh

4) Редактируем init-database.sh
#!/bin/bash
set -e

psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
    CREATE USER user WITH PASSWORD 'userpwd';
    CREATE DATABASE userdb;
    GRANT ALL PRIVILEGES ON DATABASE userdb TO user;
EOSQL

5) И запускаем docker-compose up -d всё это время вы находитесь в директории в которой у вас лежит .yml d в примере это /opt/docker_postgres
PS. в файле init-database.sh добавляем нужное кол-во баз и пользователей для этих баз.
PSS /docker-entrypoint-initdb.d находится внутри контейнера и наша задача пробросить скрипт в нее (или sql запрос)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
fox_12
@fox_12
Расставляю биты, управляю заряженными частицами
Берете файл /usr/local/bin/docker-entrypoint.sh, и дописываете логику с добавлением и баз, и пользователей
Собираете образ с вашим измененным файлом docker-entrypoint.sh
Профит
Ответ написан
@dronmaxman
VoIP Administrator
https://hub.docker.com/_/postgres


Initialization scripts
If you would like to do additional initialization in an image derived from this one, add one or more *.sql, *.sql.gz, or *.sh scripts under /docker-entrypoint-initdb.d (creating the directory if necessary). After the entrypoint calls initdb to create the default postgres user and database, it will run any *.sql files, run any executable *.sh scripts, and source any non-executable *.sh scripts found in that directory to do further initialization before starting the service.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы