Files
Ansible-Build/roles/postgres/files/docker-postgres-backup
T

85 lines
2.2 KiB
Bash
Executable File

#!/bin/bash
# Exit script if command fails
set -e
# Display Help
Help() {
echo
echo "docker-postgres-backup"
echo "######################"
echo
echo "Description: Backup docker postgres database."
echo "Syntax: docker-postgres-backup [-d|-a|-o|-c|help]"
echo "Example: docker-postgres-backup -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. Defaults to 'postgres'."
echo " help Show docker-postgres-backup manual."
echo
}
# Show help and exit
if [[ $1 == 'help' ]]; then
Help
exit
fi
# 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" ]] && [[ -z "$ALL" ]] && { echo "Parameter -d or -a|databases or all must be set" ; exit 1; }
[[ -z "$DIR" ]] && { echo "Parameter -d|dir is empty" ; exit 1; }
[[ -z "$CONTAINER" ]] && { echo "Parameter -c|container 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"