87 lines
2.2 KiB
Bash
Executable File
87 lines
2.2 KiB
Bash
Executable File
#!/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"
|