Last active
September 12, 2023 12:12
-
-
Save aleksandr-vin/41ee2062e978f2f680fd190c7e957dab to your computer and use it in GitHub Desktop.
Backup and restore docker volume data
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env bash | |
# | |
# Script to backup and restore docker volume data | |
# | |
# Example: | |
# | |
# BACKUPPED_PATH=/var/lib/postgresql/data BACKUPPED_VOLUME=my-db-volume ./db-volume-backup.sh backup my-db-volume-backup | |
# | |
set -e | |
#set -x | |
OP="$1" | |
BACKUP_NAME="$2" | |
usage() { | |
cat <<EOF | |
Backup and restore docker volume data. | |
Usage: | |
$(basename $0) (backup|restore) (backup-name) | |
EOF | |
} | |
if [[ "$BACKUP_NAME" == "" ]] | |
then | |
usage | |
exit 1 | |
fi | |
checks() { | |
if docker ps --filter "volume=${BACKUPPED_VOLUME?}" --format "{{.Names}}" | grep Up | |
then | |
echo >&2 "Containers using ${BACKUPPED_VOLUME?} volume found running. Stop them before retry." | |
exit 3 | |
fi | |
} | |
case "$OP" in | |
backup) | |
checks | |
# Create a temporary container which mounts the volume | |
docker run --rm -v ${BACKUPPED_VOLUME?}:${BACKUPPED_PATH?} -d --name backup-${BACKUPPED_VOLUME?} busybox sleep 1d >/dev/null | |
temp_dir=$(mktemp -d) | |
trap "rm -rf "$temp_dir" & docker stop backup-${BACKUPPED_VOLUME?} &" EXIT | |
# Use docker cp to copy data to the host | |
docker cp backup-${BACKUPPED_VOLUME?}:${BACKUPPED_PATH?} "$temp_dir/backup" | |
# Stop and remove the temporary container | |
docker stop backup-${BACKUPPED_VOLUME?} | |
trap "rm -rf "$temp_dir" &" EXIT | |
echo "Compressing..." | |
pwd=$(pwd) | |
(cd "$temp_dir" && tar czf "$pwd/${BACKUP_NAME?}.tar.gz" backup) | |
echo "Saved: $(du -h -s ${BACKUP_NAME?}.tar.gz)" | |
rm -rf "$temp_dir" | |
trap "" EXIT | |
;; | |
restore) | |
checks | |
# Create a temporary container which mounts the volume | |
docker run --rm -v ${BACKUPPED_VOLUME?}:${BACKUPPED_PATH?} -d --name backup-${BACKUPPED_VOLUME?} busybox sleep 1d >/dev/null | |
temp_dir=$(mktemp -d) | |
trap "rm -rf "$temp_dir" & docker stop backup-${BACKUPPED_VOLUME?} &" EXIT | |
echo "From: $(du -h -s ${BACKUP_NAME?}.tar.gz)" | |
# Extract the backup if it's compressed | |
tar xzf ${BACKUP_NAME?}.tar.gz -C "$temp_dir" | |
# Use docker cp to copy data to the volume | |
docker cp "$temp_dir/backup/." backup-${BACKUPPED_VOLUME?}:${BACKUPPED_PATH?} | |
# Stop and remove the temporary container | |
docker stop backup-${BACKUPPED_VOLUME?} | |
rm -rf "$temp_dir" | |
trap "" EXIT | |
;; | |
*) | |
usage | |
exit 2 | |
;; | |
esac |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Example run,
of backup:
and restore: