Last active
April 11, 2016 22:12
-
-
Save apsega/a83d6456c682496a846e2c9177f91bbe to your computer and use it in GitHub Desktop.
To restore Docker containers from Dropbox backups
This file contains hidden or 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
#!/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