#!/bin/bash set -e # Get script name SCRIPT=$(basename "$0") # Display Help Help() { echo echo "$SCRIPT" echo echo "Description: Backup Docker Postgres database." echo "Syntax: $SCRIPT [-d|-a|-o|-c|help]" echo "Example: $SCRIPT -d postgres,odoo -o /tmp -c postgres01" echo "options:" echo " -d Comma-separated list of database names." echo " -a Backup all databases" echo " -o Output directory. Defaults to '/var/tmp'." echo " -c Docker container name. Defaults to 'postgres'." echo " help Show $SCRIPT manual." echo } # Show help and exit if [[ "$1" == "help" ]]; then Help exit fi # Initialise option flag with a false value ALL='false' # Process params while getopts ":a :c: :d: :o:" opt; do case $opt in a) ALL='true' ;; c) CONTAINER="$OPTARG" ;; d) DATABASES="$OPTARG" ;; o) DIR="$OPTARG" ;; \?) echo "Invalid option -$OPTARG" >&2 Help exit;; esac done # Fallback to environment vars and default values : ${DIR:='/var/tmp'} : ${CONTAINER:='postgres'} # Verify variables [[ -z "$DATABASES" ]] && [[ "$ALL" == "false" ]] && { echo "Parameter -d or -a|databases or all must be set" ; exit 1; } [[ -z "$DIR" ]] && { echo "Parameter -d|dir is empty" ; exit 1; } if $ALL ; then # Get all databases from docker container DATABASE_LIST=($(docker exec "$CONTAINER" /bin/bash -c "psql -U \$POSTGRES_USER \ template1 -q -A -t -c 'SELECT datname FROM pg_database WHERE datistemplate = false;'")) # Concate database list printf -v DATABASES '%s,' "${DATABASE_LIST[@]}" DATABASES="${DATABASES%,}" fi if [[ ! -z $DATABASES ]] ; then # Split database param values DATABASE_LIST=($(echo $DATABASES | tr "," "\n")) fi # Create backup folder mkdir -p ${DIR}/${CONTAINER} # Cleanup backup folder rm -rf ${DIR}/${CONTAINER}/* # Create dump with docker for each database for DATABASE in "${DATABASE_LIST[@]}" do echo "Run Docker Postgres backup for $DATABASE" docker exec $CONTAINER /bin/bash -c "pg_dump -U \$POSTGRES_USER $DATABASE" > "${DIR}/${CONTAINER}/${DATABASE}.sql" done # Notify if backup has finished echo "The Docker Postgres backup has finished: ${DIR}/${CONTAINER}/{${DATABASES}}.sql"