diff options
| -rw-r--r-- | docker_tools/README.md | 46 | ||||
| -rwxr-xr-x | docker_tools/docker_backup_all_sql.sh | 38 | ||||
| -rwxr-xr-x | docker_tools/docker_backup_crazy.sh | 57 | ||||
| -rwxr-xr-x | docker_tools/docker_backup_offline_vol.sh | 15 | ||||
| -rwxr-xr-x | docker_tools/docker_backup_vol.sh | 89 | ||||
| -rwxr-xr-x | docker_tools/docker_compose_backup.sh | 78 | ||||
| -rwxr-xr-x | docker_tools/docker_restore_vol.sh | 31 |
7 files changed, 354 insertions, 0 deletions
diff --git a/docker_tools/README.md b/docker_tools/README.md new file mode 100644 index 0000000..876ed31 --- /dev/null +++ b/docker_tools/README.md @@ -0,0 +1,46 @@ +# ABOUT + +This is my collection of short and dirty bash script +to ease the execution of some common docker tasks. + +# RESTORE NEW VOLUME FROM TAR ARCHIVE +./docker\_resotre\_vol.sh \[source-tar-archive\] \[new-target-volume\] + +# BACKUP DOCKER VOLUMES +./docker\_backup\_vol.sh +Run without params for help. Supports --all-vols, --single-vol, --exclude-vol + +# BACKUP DOCKER VOLUME OF A CONTAINER THAT IS NOT RUNNING +docker\_backup\_offline\_vol.sh + +# BACKUP ALL MARIADB AND MYSQL DATABASES +./docker\_backup\_all\_sql.sh +Dumps all runinng containers where the image contains 'mariadb' or 'mysql'. +The root passwords are extracted via 'docker inspect' + +# BACKUP SOME DATA ABOUT RUNNING CONTAINERS +./docker\_backup\_crazy.sh + +The execution of this simple script will hopefully create a backup +of the following entities for all currently running docker containers: + +- environment variables -> to a txt file +- all mounted file binds -> to a gzipped tar file +- all mounted directory binds -> to a gzipped tar file +- all mounted data volumes -> to a gzipped tar file + +The backups will be placed in the current directory and prefixed +with a timestamp and container name. + +# AUTO BACKUP ALL DOCKER-COMPOSE CONTAINERS IN A GIVEN TREE +docker\_compose\_backup.sh + +# CAUTION + +However this was never tested, the scripts will most likely fail +pathetically if variables containing spaces are encountered !!! + +# COPYRIGHT + +by the Software Fools Docker Division, 2017-2018 A.D. + diff --git a/docker_tools/docker_backup_all_sql.sh b/docker_tools/docker_backup_all_sql.sh new file mode 100755 index 0000000..eebe93e --- /dev/null +++ b/docker_tools/docker_backup_all_sql.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +# Please read the README.md distributed along this script + +#set -x + +REGEX_MATCH="mariadb|mysql" + +NAMES_IMAGES=`docker ps --format '{{.Names}}\t{{.Image}}'` +NAMES=$(echo -e "${NAMES_IMAGES}" | awk '{print $1}') +IMAGES=$(echo -e "${NAMES_IMAGES}" | awk '{print $2}') + +IFS=$'\n' + +for name_image in $NAMES_IMAGES; do + + NAME=$(echo -e "${name_image}" | awk -F "\t" '{print $1}') + IMAGE=$(echo -e "${name_image}" | awk -F "\t" '{print $2}') + + TIMESTAMP=`date +"%Y%m%d_%H%M%S"` + FILENAME=${TIMESTAMP}_$IMAGE_$NAME.sql + + if [[ $IMAGE =~ $REGEX_MATCH ]]; then + + echo -------------------------------------------------------------- + echo Found Matching Image: $IMAGE running in cotnainer named $NAME + + #docker inspect $NAME | grep MYSQL_ROOT_PASSWORD + PASS=$(docker inspect $NAME | grep MYSQL_ROOT_PASSWORD | sed 's/^.*"[^=]*=\([^"]*\).*$/\1/') + echo Inspected container : Extracted Root Password: xxxxxx + echo Executing mysqldump to File $NAME.sql + #--single-transaction consider vor InnoDB + docker exec $NAME mysqldump -p$PASS --lock-tables --routines --triggers --all-databases > $FILENAME + + fi + +done + diff --git a/docker_tools/docker_backup_crazy.sh b/docker_tools/docker_backup_crazy.sh new file mode 100755 index 0000000..a921795 --- /dev/null +++ b/docker_tools/docker_backup_crazy.sh @@ -0,0 +1,57 @@ +#!/bin/bash + +# Please read the README.md distributed along this script + +CONTAINERS=`docker ps --format '{{.Names}}'` + +echo "" +echo " == BACKUP RUNNING DOCKER BINDS & VOLUMES (v0.1) == " +echo "" + +for c in $CONTAINERS; do + + IMAGE=`docker inspect -f '{{.Config.Image}}' $c` + VOLUMES=`docker inspect -f '{{range .Mounts}}{{if eq .Type "volume"}}{{println .Name}}{{end}}{{end}}' $c` + BINDS=`docker inspect -f '{{range .Mounts}}{{if eq .Type "bind"}}{{println .Source}}{{end}}{{end}}' $c` + TIMESTAMP=`date +"%Y%m%d_%H%M%S"` + ENVIRONMENT=`docker inspect -f '{{ range .Config.Env }}--{{println .}}{{end}}' $c` + + echo " + Backing up container $c (running docker image $IMAGE)" + FILENAME=${TIMESTAMP}_${c}_env.txt + echo " +--> backing up environment variables to file: $FILENAME" + echo $ENVIRONMENT > $FILENAME + + + for v in $VOLUMES; do + FILENAME=${TIMESTAMP}_${c}_volume_${v}.tar.gz + echo " +--> backing up volume: $v to file: $FILENAME" + docker run --rm -it -v $v:/IN:ro -v `pwd`:/OUT bash tar -C /IN -czf /OUT/$FILENAME . + done + + COUNT=0 + + for b in $BINDS; do + ((COUNT++)) + FILENAME=${TIMESTAMP}_${c}_bind_${COUNT}.tar.gz + + if [[ -d "$b" ]] + then + echo " |--> backing up bind (directory) ($COUNT): $b to file: $FILENAME" + docker run --rm -it -v $b:/IN:ro -v `pwd`:/OUT bash tar -C /IN -czf /OUT/$FILENAME . + fi + + if [[ -f "$b" ]] + then + echo " |--> backing up bind (file) ($COUNT): $b to file: $FILENAME" + docker run --rm -it -v $(dirname $b):/IN:ro -v `pwd`:/OUT bash tar -C /IN -czf /OUT/$FILENAME $(basename $b) + fi + + done + + echo '' + +done + + + + diff --git a/docker_tools/docker_backup_offline_vol.sh b/docker_tools/docker_backup_offline_vol.sh new file mode 100755 index 0000000..792956c --- /dev/null +++ b/docker_tools/docker_backup_offline_vol.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +#set -x # print executed commands to shell +set -e # exit if any command reutrns non-zero + +if [ "$#" -ne 2 ]; then + echo + echo " Usage: $0 [docker-volume-name] [target-file-name]" + echo + echo " tar docker-volume-name to target-file-name in current directory." + echo + exit +fi + +docker run --rm -it -v $1:/IN:ro -v `pwd`:/OUT bash tar -C /IN -czf /OUT/$2 . diff --git a/docker_tools/docker_backup_vol.sh b/docker_tools/docker_backup_vol.sh new file mode 100755 index 0000000..85bfb85 --- /dev/null +++ b/docker_tools/docker_backup_vol.sh @@ -0,0 +1,89 @@ +#!/bin/bash + +# Please read the README.md distributed along this script + +#set -x + +ALL_VOLS=`docker volume ls --format '{{.Name}}'` +TEMP_VOLS= +SKIP_VOLS= +VOLS= + +if [ "$#" -eq 0 ]; then + + echo "" + echo "-----------------------------------------" + echo "Usage: $0" + echo "--single-vol [VOLUME] You can explicitly include a volume (can occur multiple times)" + echo "--exclude-vol [VOLUME] You can explicitly exclude a volume (can occur multiple times)" + echo "--all-vol This will backup all volumes (as reported by 'docker volume ls')" + echo "-----------------------------------------" + echo "" + + exit +fi + +while [[ $# -gt 0 ]] +do +key="$1" +case $key in + --all-vol) + TEMP_VOLS+=$ALL_VOLS + shift + ;; + --single-vol) + TEMP_VOLS+=" $2" + shift + shift + ;; + --exclude-vol) + SKIP_VOLS+=" $2" + shift + shift + ;; +esac +done + +#TODO: fix this inefficient shit! +for v in $TEMP_VOLS; do + + SKIP="0" + + for t in $VOLS; do + + #echo "test $v agains $t" + if [ "$t" == $v ]; then + # echo "skip" + SKIP=1 + fi + done + + for t in $SKIP_VOLS; do + + #echo "test $v agains $t" + if [ "$t" == $v ]; then + # echo "skip" + SKIP=1 + fi + done + + if [ "$SKIP" == "0" ]; then + # echo "add $v" + VOLS+=" $v" + fi + +done + +for v in $VOLS; do + + TIMESTAMP=`date +"%Y%m%d_%H%M%S"` + FILENAME=${TIMESTAMP}_volume_$v.tar.gz + + echo " +--> backing up volume: $v to file: $FILENAME" + docker run --rm -it -v $v:/IN:ro -v `pwd`:/OUT bash tar -C /IN -czf /OUT/$FILENAME . + +done + + + + diff --git a/docker_tools/docker_compose_backup.sh b/docker_tools/docker_compose_backup.sh new file mode 100755 index 0000000..c279463 --- /dev/null +++ b/docker_tools/docker_compose_backup.sh @@ -0,0 +1,78 @@ +#!/bin/bash + +set -e + +DOCKINGDIR=/home/miguel/docking +BACKUPDIR=/home/miguel/BACKUP +BACKUPSCRIPT=/home/miguel/git/docker_tools/docker_backup_offline_vol.sh +TIMESTAMP=`date +"%Y%m%d_%H%M%S"` + +DOCKS=`ls $DOCKINGDIR` + +function backup_dock { + + SOURCE=$1 + TARGET=$2 + + mkdir -p $TARGET + tar -C $SOURCE -cf $TARGET/compose.tar . + + CONTAINERS=`cd $SOURCE && docker-compose ps -q` + ALLVOLUMES= + + for c in $CONTAINERS + do + + + NAME=`docker inspect -f '{{ .Name }}' $c | sed 's/\///'` + echo container = [$NAME] + + docker inspect $c > $TARGET/$NAME.json + + VOLUMES=`docker inspect -f '{{ range .Mounts }}{{.Name}} {{end}}' $c` + + for v in $VOLUMES + do + ALLVOLUMES+="$v " + done + + done + + # remove duplicates + ALLVOLUMES=`echo $ALLVOLUMES | tr ' ' '\n' | sort | uniq` + + ## STOP ## + cd $SOURCE + set +e + docker-compose down + set -e + ## + + cd $TARGET + sudo chown 100000 . + + for v in $ALLVOLUMES + do + echo volume = [$v] + $BACKUPSCRIPT $v $v.tar + done + + ## START ## + cd $SOURCE + docker-compose up -d + ## + +} + + +########### CYCLE THROUGH ALl DOCKS ############## + +for d in $DOCKS +do + # SKIP xxx FOLDER! + if [ "$d" == "xxx" ]; then + continue + fi + echo dock = [$d] + backup_dock $DOCKINGDIR/$d $BACKUPDIR/$TIMESTAMP/$d +done diff --git a/docker_tools/docker_restore_vol.sh b/docker_tools/docker_restore_vol.sh new file mode 100755 index 0000000..5be6a12 --- /dev/null +++ b/docker_tools/docker_restore_vol.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +# Please read the README.md distributed along this script + +if [ "$#" -ne 2 ]; then + + echo "" + echo "-----------------------------------------" + echo "Usage: $0 [source-archive] [target-volume]" + echo "" + echo "This will un-tar the [source-archive] to a NEW docker [target-volume]" + echo "-----------------------------------------" + echo "" + + exit +fi + +echo resotring archive: $1 to data-volume $2 + +VOLS=`docker volume ls --format '{{.Name}}'` + +for v in $VOLS; do + + if [ "$v" == "$2" ]; then + echo "volume $v already exists! Bailing out..." + exit + fi + +done + +docker run --rm -it -v `pwd`:/IN -v $2:/OUT bash tar -C /OUT -xf /IN/$1 |
