Я использую 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, просто изменив переменную окружения. Понятно, что это можно сделать вручную, конечно.