#!/bin/bash set -e SCRIPT=$(basename "$0") VERSION="1.0.0" # Display Help Help() { echo echo "$SCRIPT" echo echo "Description: Duplicate database in Postgres Docker container." echo "Syntax: $SCRIPT [-c|-s|-t|-r|-u|-V|help]" echo "Example: $SCRIPT -c postgres01 -s keycloak-main -t keycloak-int -r -u" echo "options:" echo " -c Docker container." echo " -s Source database name." echo " -t Target database name." echo " -r Replace existing database." echo " -V Show $SCRIPT version." echo " help Show $SCRIPT manual." echo } # Show help and exit if [[ "$1" == "help" ]]; then Help exit fi # Initialise option flag with a false value REPLACE='false' # Process params while getopts ":c: :s: :t: :r :V" opt; do case $opt in c) CONTAINER="$OPTARG";; s) SOURCE_DATABASE="$OPTARG";; t) TARGET_DATABASE="$OPTARG";; r) REPLACE='true';; V) echo "$SCRIPT version $VERSION" exit 0 ;; \?) echo "Invalid option -$OPTARG" >&2 Help exit;; esac done # Verify variables [[ -z "$CONTAINER" ]] && { echo "Parameter -c|container is empty" ; exit 1; } [[ -z "$SOURCE_DATABASE" ]] && { echo "Parameter -s|source is empty" ; exit 1; } [[ -z "$TARGET_DATABASE" ]] && { echo "Parameter -t|target is empty" ; exit 1; } [[ "$TARGET_DATABASE" == "$SOURCE_DATABASE" ]] && { echo "Parameter -s|source and -t|target cannot be the same" ; exit 1; } # Switch container name with id CONTAINER_ID=$(docker ps -f "name=$CONTAINER" -q | tail -n1) [[ -z "$CONTAINER_ID" ]] && { echo "Container id for $CONTAINER not found." ; exit 1; } # Set alias docker_exec_bash="docker exec $CONTAINER_ID /bin/bash -c" docker_exec_root_bash="docker exec --user root $CONTAINER_ID /bin/bash -c" # Clear database if $REPLACE; then docker-postgres-drop -c "$CONTAINER" -d "$TARGET_DATABASE" fi # Kill datbase connections echo "Kill database connections on $SOURCE_DATABASE." QUERY="SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '$SOURCE_DATABASE';" $docker_exec_bash "psql postgres://\$POSTGRES_USER:\$POSTGRES_PASSWORD@\$HOSTNAME:5432/postgres -c \"$QUERY\"" # Duplicate database echo "Duplicate database from $SOURCE_DATABASE to $TARGET_DATABASE." $docker_exec_bash "createdb -U \$POSTGRES_USER -T $SOURCE_DATABASE $TARGET_DATABASE" # Notify if backup has finished echo "The duplication for Postgres database $TARGET_DATABASE has finished."