summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docker_tools/README.md46
-rwxr-xr-xdocker_tools/docker_backup_all_sql.sh38
-rwxr-xr-xdocker_tools/docker_backup_crazy.sh57
-rwxr-xr-xdocker_tools/docker_backup_offline_vol.sh15
-rwxr-xr-xdocker_tools/docker_backup_vol.sh89
-rwxr-xr-xdocker_tools/docker_compose_backup.sh78
-rwxr-xr-xdocker_tools/docker_restore_vol.sh31
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