Skip to content

Instantly share code, notes, and snippets.

@funkyfisch
Last active January 16, 2024 12:01
Show Gist options
  • Save funkyfisch/0372475f82639cbba0fbc55df7eff648 to your computer and use it in GitHub Desktop.
Save funkyfisch/0372475f82639cbba0fbc55df7eff648 to your computer and use it in GitHub Desktop.
Migrate a docker volume from one host to another
#!/bin/bash
# Environment check
# If migrating from localhost, set this to localhost
if [[ ! $SOURCE_HOST_ADDRESS ]]
then
echo "Please set the current host address in SOURCE_HOST_ADDRESS"
exit 1
fi
# If migrating from localhost, set this to $USER
if [[ ! $SOURCE_HOST_USER ]]
then
echo "Please set the current host user in SOURCE_HOST"
exit 1
fi
# If migrating to localhost, set this to localhost
if [[ ! $TARGET_HOST_ADDRESS ]]
then
echo "Please set the new host address in TARGET_HOST_ADDRESS"
exit 1
fi
# If migrating to localhost, set this to $USER
if [[ ! $TARGET_HOST_USER ]]
then
echo "Please set the new host user in TARGET_HOST_USER"
exit 1
fi
# Argument check
if [[ ! $1 ]]
then
echo "Please supply a docker volume name, as displayed by the command 'docker volume ls'"
exit 1
fi
volume_name=$1
# Export the volume from the current instance
echo "Exporting volume $volume_name on $SOURCE_HOST_ADDRESS"
ssh "$SOURCE_HOST_USER"@"$SOURCE_HOST_ADDRESS" "\
mkdir -p \$HOME/docker-volume-backup
docker run \
--rm \
-v $volume_name:/volume-backup-source \
-v \$HOME/docker-volume-backup:/volume-backup-target \
busybox \
sh -c 'cd /volume-backup-source && tar cf /volume-backup-target/backup.tar .' \
"
# Transfer the exported volume to the new address
echo "Transferring exported volume $volume_name from $SOURCE_HOST_ADDRESS to $TARGET_HOST_ADDRESS"
ssh "$TARGET_HOST_USER"@"$TARGET_HOST_ADDRESS" "mkdir -p \$HOME/docker-volume-backup"
scp -3 "$SOURCE_HOST_USER"@"$SOURCE_HOST_ADDRESS":./docker-volume-backup/backup.tar \
"$TARGET_HOST_USER"@"$TARGET_HOST_ADDRESS":./docker-volume-backup/backup.tar
# Restore the backup
echo "Creating volume $volume_name on $TARGET_HOST_ADDRESS"
ssh "$TARGET_HOST_USER"@"$TARGET_HOST_ADDRESS" "\
docker volume create $volume_name \
&& docker run \
--rm \
-v $volume_name:/volume-backup-target \
-v \$HOME/docker-volume-backup/:/volume-backup-source \
busybox \
sh -c 'cd /volume-backup-target && tar xf /volume-backup-source/backup.tar .' \
"
# Clean up residual files
echo "Cleaning up unnecessary files"
ssh "$SOURCE_HOST_USER"@"$SOURCE_HOST_ADDRESS" "rm -rf \$HOME/docker-volume-backup"
ssh "$TARGET_HOST_USER"@"$TARGET_HOST_ADDRESS" "rm -rf \$HOME/docker-volume-backup"
echo "Successfully migrated docker volume $volume_name from $SOURCE_HOST_ADDRESS to $TARGET_HOST_ADDRESS"
@sp1thas
Copy link

sp1thas commented Mar 9, 2023

This script is so useful! Thanks @funkyfisch for the effort 🙏

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment