Skip to content

Instantly share code, notes, and snippets.

@apsega
Last active April 11, 2016 22:12
Show Gist options
  • Save apsega/a83d6456c682496a846e2c9177f91bbe to your computer and use it in GitHub Desktop.
Save apsega/a83d6456c682496a846e2c9177f91bbe to your computer and use it in GitHub Desktop.
To restore Docker containers from Dropbox backups
#!/bin/bash
# Usage example: ./script.sh container_name dropbox_user -days_back, i.e. ./script.sh jenkins EA -1
# Variables
CONTAINER_NAME=$1
IMAGE_NAME=$(docker ps -f name=$CONTAINER_NAME --format {{.Image}})
DATE=$(date +"%Y-%m-%d" --date="$3 day")
# From which Dropbox to download
if [[ "$2" == "EA" ]]; then
DROPBOX_UPLOADER=/home/Backups/gitlab.sh
APP_KEY=/home/Backups/.gitlab_dropbox_uploader
elif [[ "$2" == "IGC" ]]; then
DROPBOX_UPLOADER=/home/Backups/ignasc.sh
APP_KEY=/home/Backups/.ignasc_dropbox_uploader
else
DROPBOX_UPLOADER=/home/Backups/gitlab.sh
APP_KEY=/home/Backups/.gitlab_dropbox_uploader
fi
function download_sql {
# Download .tar.gz or .sql
$DROPBOX_UPLOADER -f $APP_KEY download /$CONTAINER_NAME/"$CONTAINER_NAME"_"$DATE".sql /tmp/
}
function download_tar {
# Download .tar.gz or .sql
$DROPBOX_UPLOADER -f $APP_KEY download /$CONTAINER_NAME/"$CONTAINER_NAME"_"$DATE".tar.gz /tmp/
}
function import_sql {
docker exec -i $CONTAINER_NAME sh -c 'mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /tmp/$CONTAINER_NAME/"$CONTAINER_NAME"_"$DATE".sql
}
function extract_files {
# Stop container
docker stop $CONTAINER_NAME
# Check if container stopped successfully
if [[ $(docker ps -f name=$CONTAINER_NAME --format "{{.Names}}") == "$CONTAINER_NAME" ]]; then
printf "$CONTAINER_NAME failed to stop. It's currently in $(docker ps -f name=$CONTAINER_NAME --format "{{.Status}}") status."
exit 1
fi
# Extract backup and place it to data volume
tar zxfv /tmp/$CONTAINER_NAME/"$CONTAINER_NAME"_"$DATE".tar.gz -C /
# Start container
docker start $CONTAINER_NAME
# Check if container started successfully
if [[ $(docker ps -f name=$CONTAINER_NAME --format "{{.Names}}") == "$CONTAINER_NAME" ]]; then
exit 0
else
printf "$CONTAINER_NAME failed to start. It's current status is $(docker ps -a -f name=$CONTAINER_NAME --format "{{.Status}}")"
exit 1
fi
}
function gitlab_restore {
# Download newest backup file
$DROPBOX_UPLOADER -f $APP_KEY download $($DROPBOX_UPLOADER -f $APP_KEY list $CONTAINER_NAME | tail -1 | awk '{print $3}') /tmp/
# Copy backup to gitlab data volume
docker cp /tmp/*"$CONTAINER_NAME"*.tar gitlab:/var/opt/gitlab/backups/
# Initialise restore
docker exec -ti gitlab sh -c "gitlab-rake gitlab:backup:restore"
}
# Create directory where backups will be downloaded
mkdir -p /tmp/$CONTAINER_NAME
case $IMAGE_NAME in
*mysql*)
download_sql
import_sql
;;
*mariadb*)
download_sql
import_sql
;;
*gitlab*)
gitlab_restore
;;
*)
download_tar
extract_files
;;
esac
# Cleanup
rm -rv /tmp/$CONTAINER_NAME
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment