Postgres docker: добавить дополнительную базу данных после инициализации - PullRequest
0 голосов
/ 22 января 2020

Я использую Postgres в среде docker -compose для размещения баз данных для нескольких контейнеров. В основном я хочу добавить базу данных для каждого приложения непосредственно из docker -compose без необходимости создания баз данных и пользователей вручную. Для этого я использую функцию сценария инициализации образа Postgres docker и копирую следующий сценарий bash, подключая том:

  db:
    image: postgres:9.6
    container_name: db
    restart: always
    volumes:
      - postgres-data:/var/lib/postgresql/data
      - /opt/docker/pgsql-entrypoint:/docker-entrypoint-initdb.d
    environment:
      - POSTGRES_PASSWORD={{ vault_pgsql_root_password }}
      - POSTGRES_MULTIPLE_DATABASES=confluence-{{ confluence_pgsql_password }},keycloak-{{ keycloak_pgsql_password }},gitlab-{{ gitlab_pgsql_password }},jira-{{ jira_pgsql_password }}

В основном переменная окружения POSTGRES_MULTIPLE_DATABASES содержит все базы данных и пользователей, которые должны быть созданы. Пароль выглядит следующим образом:

#!/bin/bash

set -e
set -u

function create_user_and_database() {
    local database=$1
    local password=$2
    echo "  Creating user and database '$database'"
    psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL
        CREATE USER $database WITH PASSWORD '$password';
        CREATE DATABASE $database;
        GRANT ALL PRIVILEGES ON DATABASE $database TO $database;
EOSQL
}

if [ -n "$POSTGRES_MULTIPLE_DATABASES" ]; then
    echo "Multiple database creation requested: $POSTGRES_MULTIPLE_DATABASES"
    for entry in $(echo $POSTGRES_MULTIPLE_DATABASES | tr ',' ' '); do
        db=$(echo $entry | cut -f1 -d-)
        pw=$(echo $entry | cut -f2 -d-)
        create_user_and_database $db $pw
    done
    echo "Multiple databases created"
fi

Моя проблема: в определенный момент (сейчас;)) я могу захотеть добавить дополнительную услугу. Простое добавление дополнительной пары к переменной среды не работает, поскольку изображение Postgres пропускает этап инициализации, если данные уже существуют. Есть ли способ по-прежнему достичь этого поведения?

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

1 Ответ

0 голосов
/ 22 января 2020

Вы всегда можете подключиться к серверу с клиентом базы данных и сделать это вручную. Если вы не хотите предоставлять порт базы данных хосту, вы можете запустить клиент postgres из терминала в контейнере postgres. Чтобы открыть терминал в контейнере:

 > docker exec -it <container_name> /bin/sh

Затем измените пользователей на postgres и запустите клиент

 # su postgres
 postgres@1778e9755f65:/$ psql

Оказавшись внутри, просто создайте базу данных: https://www.postgresql.org/docs/9.0/sql-createdatabase.html

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