123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- #!/bin/bash
- OPTIND=1
- VOLUMES=''
- ALLFLAG=''
- OUTDIR='./'
- NOAUTORESTART=''
- # get arguments
- while getopts "h?v:o:na" opt; do
- case "$opt" in
- h|\?)
- echo "
- docker-backup.sh stops all running containers, exports them and gzips them to the
- current directory, then restarts the previously running containers in the reverse
- order of which they were stopped.
- This script assumes it is being run as root, or the current user is in the docker group.
- Usage: "$0 "[args]
- -a Backup all containers, not just running containers. Only running containers will be
- restarted after backup (unless otherwise specified by -n)
- -h Print this help message.
- -n Don't restart containers after backup
- -o OUTDIR Backups are sent to OUTDIR, rather than the current directory
- -v VOLUME (-v SECONDVOLUME -v THIRDVOLUME...)]
- Include volume directories with your backup. These are made once the container is
- stopped to avoid corruption.
- "
- exit 0
- ;;
- v) VOLUMES=$VOLUMES\;$OPTARG
- ;;
- o) OUTDIR=$OPTARG
- ;;
- n) NOAUTORESTART='1'
- ;;
- a) ALLFLAG='-a'
- esac
- done
- # Cleanup from getopts
- shift $((OPTIND-1))
- [ "$1" = "--" ] && shift
- # Check if outdir exists, else (try to) create it
- if [ ! -d $OUTDIR ]
- then
- mkdir $OUTDIR
- fi
- # Check or write access
- if [ ! -w $OUTDIR ]
- then
- echo $OUTDIR is not writable. Exiting...
- exit 1
- fi
- # Remove first semicolon from volumes list
- VOLUMES=$(echo $VOLUMES | sed 's/^.//')
- # Get requested list of containers
- CONTAINERS=$(docker ps $ALLFLAG --format '{{.Names}}' | sed ':a;N;$!ba;s/\n/ /g')
- RUNNINGCONTAINERS=''
- if [ ! $NOAUTORESTART ]
- then
- RUNNINGCONTAINERS=$(docker ps --format '{{.Names}}' | sed ':a;N;$!ba;s/\n/ /g' | awk '{for(i=NF;i>0;--i)printf "%s%s",$i,(i>1?OFS:ORS)}')
- fi
- # Stop all containers
- echo Stopping containers...
- for i in $CONTAINERS
- do
- docker stop $i
- done
- # Wait for all to be stopped
- wait
- # Export each container
- echo Exporting containers...
- for i in $CONTAINERS
- do
- docker export $i | gzip -c > $OUTDIR/$i-$(date +%Y%m%d-%H%M%S).tar.gz && echo "Exported "$i &
- done
- wait
- # Get specified volumes delimited by semicolons
- if [ $VOLUMES ]
- then
- echo Backing up volumes...
- OLDIFS=$IFS
- IFS=';'
- for i in $VOLUMES
- do
- tar czf $OUTDIR/$(basename $i)-$(date +%Y%m%d-%H%M%S).tar.gz $i && echo "Backed up "$i &
- done
- IFS=$OLDIFS
- fi
- # Restart previously running containers (if any were given or it was requested)
- if [ ! $NOAUTORESTART ]
- then
- echo Restarting previously running containers...
- for i in $RUNNINGCONTAINERS
- do
- docker start $i &
- done
- wait
- fi
|