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/create-multiple-postgresql-databases.sh b/create-multiple-postgresql-databases.sh index aa665fa..41f0226 100755 --- a/create-multiple-postgresql-databases.sh +++ b/create-multiple-postgresql-databases.sh @@ -4,18 +4,32 @@ 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 DATABASE $database; - GRANT ALL PRIVILEGES ON DATABASE $database TO $database; -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 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"