From f5d8d3202a9246276b047d54108b2e35a6f2fdd2 Mon Sep 17 00:00:00 2001 From: MartinKaburu Date: Tue, 12 Mar 2019 18:06:11 +0300 Subject: [PATCH 1/2] (users): enable multiple-users multiple-databases - allow users to create databases with different users --- Dockerfile | 7 ++++++- README.md | 8 +++----- create-multiple-postgresql-databases.sh | 9 +++++---- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/Dockerfile b/Dockerfile index ee9c3d0..1f014f2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,2 +1,7 @@ -FROM postgres:9.6 +FROM library/postgres:9.6-alpine + COPY create-multiple-postgresql-databases.sh /docker-entrypoint-initdb.d/ + +RUN chmod +x /docker-entrypoint-initdb.d/create-multiple-postgresql-databases.sh + +EXPOSE 5432 diff --git a/README.md b/README.md index 3db6ca3..b391923 100644 --- a/README.md +++ b/README.md @@ -27,8 +27,7 @@ Clone the repository, mount its directory as a volume into volumes: - ../docker-postgresql-multiple-databases:/docker-entrypoint-initdb.d environment: - - POSTGRES_MULTIPLE_DATABASES=db1,db2 - - POSTGRES_USER=myapp + - POSTGRES_MULTIPLE_DATABASES="DB1,ownerOfDB1: DB2,ownerOfDB2: ...DB(n), ownerOfDB(n)" - POSTGRES_PASSWORD= ### By building a custom image @@ -45,8 +44,7 @@ to the container: myapp-postgresql: image: eu.gcr.io/your-project/postgres-multi-db environment: - - POSTGRES_MULTIPLE_DATABASES=db1,db2 - - POSTGRES_USER=myapp + - POSTGRES_MULTIPLE_DATABASES="DB1,ownerOfDB1: DB2,ownerOfDB2: ...DB(n), ownerOfDB(n)" - POSTGRES_PASSWORD= ### Non-standard database names @@ -54,4 +52,4 @@ to the container: If you need to use non-standard database names (hyphens, uppercase letters etc), quote them in `POSTGRES_MULTIPLE_DATABASES`: environment: - - POSTGRES_MULTIPLE_DATABASES="test-db-1","test-db-2" + - POSTGRES_MULTIPLE_DATABASES="DB1","ownerOfDB1": "DB2","ownerOfDB2": ..."DB(n)", "ownerOfDB(n)" diff --git a/create-multiple-postgresql-databases.sh b/create-multiple-postgresql-databases.sh index aa665fa..83f5adb 100755 --- a/create-multiple-postgresql-databases.sh +++ b/create-multiple-postgresql-databases.sh @@ -4,18 +4,19 @@ set -e set -u function create_user_and_database() { - local database=$1 + local database=$(echo $1 | tr ',' ' ' | awk '{print $1}') + local owner=$(echo $1 | tr ',' ' ' | awk '{print $2}') echo " Creating user and database '$database'" psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL - CREATE USER $database; + CREATE USER $owner IF NOT EXISTS; CREATE DATABASE $database; - GRANT ALL PRIVILEGES ON DATABASE $database TO $database; + GRANT ALL PRIVILEGES ON DATABASE $database TO $owner; EOSQL } if [ -n "$POSTGRES_MULTIPLE_DATABASES" ]; then echo "Multiple database creation requested: $POSTGRES_MULTIPLE_DATABASES" - for db in $(echo $POSTGRES_MULTIPLE_DATABASES | tr ',' ' '); do + for db in $(echo $POSTGRES_MULTIPLE_DATABASES | tr ':' ' '); do create_user_and_database $db done echo "Multiple databases created" From 48ee85876c745cf3f2c3f4c00b1425fd5acab2cc Mon Sep 17 00:00:00 2001 From: Cuba Stanley Date: Mon, 27 Mar 2023 15:57:24 +0100 Subject: [PATCH 2/2] Update script for database edit functions --- create-multiple-postgresql-databases.sh | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/create-multiple-postgresql-databases.sh b/create-multiple-postgresql-databases.sh index 83f5adb..41f0226 100755 --- a/create-multiple-postgresql-databases.sh +++ b/create-multiple-postgresql-databases.sh @@ -8,10 +8,23 @@ function create_user_and_database() { local owner=$(echo $1 | tr ',' ' ' | awk '{print $2}') echo " Creating user and database '$database'" psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL - CREATE USER $owner IF NOT EXISTS; - CREATE DATABASE $database; - GRANT ALL PRIVILEGES ON DATABASE $database TO $owner; -EOSQL + DO + \$do\$ + BEGIN + IF EXISTS ( + SELECT * FROM pg_catalog.pg_user + WHERE pg_user.usename = '$owner' + ) THEN + RAISE NOTICE 'Role $owner already exists, skipping creation'; + ELSE + CREATE USER "$owner" LOGIN PASSWORD '$POSTGRES_PASSWORD'; + END IF; + END + \$do\$; + CREATE DATABASE "$database"; + GRANT ALL ON DATABASE "$database" TO "$owner"; + ALTER DATABASE "$database" OWNER TO "$owner"; + EOSQL } if [ -n "$POSTGRES_MULTIPLE_DATABASES" ]; then