#!/bin/bash set -e # Get script name SCRIPT=$(basename "$0") # Display Help Help() { echo echo "$SCRIPT" echo echo "Description: Restore Docker Postgres database." echo "Syntax: $SCRIPT [-c|-d|-f|-r|-i|help]" echo "Example: $SCRIPT -d odoo -f /tmp/dump.sql -c postgres01 -r" echo "options:" echo " -c Docker container name. Defaults to 'postgres'." echo " -d Name of database. Defaults to filename" echo " -f Path to sql dump." echo " -r Replace existing database." echo " -i Create database." echo " help Show $SCRIPT manual." echo } # Show help and exit if [[ "$1" == "help" ]]; then Help exit fi # Initialise option flag with a false value DROP='false' CREATE='false' # Process params while getopts ":c: :d: :f: :r :i" opt; do case $opt in c) CONTAINER="$OPTARG";; d) DATABASE="$OPTARG";; f) FILE="$OPTARG";; r) DROP='true' CREATE='true' ;; i) CREATE='true';; \?) echo "Invalid option -$OPTARG" >&2 Help exit;; esac done # Fallback to environment vars and default values : ${CONTAINER:='postgres'} FILENAME=$(basename -- "$FILE") : ${DATABASE:="${FILENAME%%.*}"} # Verify variables [[ -z "$FILE" ]] && { echo "Parameter -f|filename is empty" ; exit 1; } [[ -z "$DATABASE" ]] && { echo "Parameter -d|database is empty" ; exit 1; } # Get postgres user POSTGRES_USER=$(docker exec $CONTAINER bash -c "echo \$POSTGRES_USER") if $DROP; then docker-postgres-drop -c $CONTAINER -d $DATABASE fi if $CREATE; then echo "Create Postgres database $DATABASE ..." docker exec $CONTAINER createdb -U $POSTGRES_USER $DATABASE fi # Start restore echo "Restore Postgres database $DATABASE from $FILE ..." cat $FILE | docker exec -i $CONTAINER psql -U $POSTGRES_USER -d $DATABASE echo "Grant all privileges on $DATABASE to $POSTGRES_USER ..." docker exec $CONTAINER psql -U $POSTGRES_USER -d template1 -c "GRANT ALL PRIVILEGES ON DATABASE \"$DATABASE\" TO $POSTGRES_USER;" # Notify if backup has finished echo "The Docker Postgres restore has finished."