Postgres码头工人:初始化后添加其他数据库

问题描述 投票:0回答:1

我正在docker-compose环境中使用Postgres来托管多个容器的数据库。我基本上想直接从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 environment变量包含应创建的所有数据库和用户。密码如下:

#!/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映像将跳过初始化步骤。有没有办法可以实现这种行为?

编辑:我应该已经指定要通过更改环境变量从组合文件中自动执行此操作。很明显,当然可以手动完成。

postgresql docker
1个回答
0
投票

您始终可以使用数据库客户端连接到服务器,并手动进行。如果您不想将数据库端口公开给主机,则可以从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

© www.soinside.com 2019 - 2024. All rights reserved.