diff --git a/README.md b/README.md index ac1aed0..4faf2b9 100644 --- a/README.md +++ b/README.md @@ -75,3 +75,8 @@ will clean and restore volume named `some_volume` from `some_archive.tar.bz2` ar ``` docker ps -a --filter volume=[volume-name] ``` + +1. Exclude some files from the backup and output archive to stdout + ``` + docker run -v [volume-name]:/volume --rm loomchild/volume-backup backup -e [excluded-glob] - > [archive-name] + ``` diff --git a/volume-backup.sh b/volume-backup.sh index 463a8af..c1c17d7 100755 --- a/volume-backup.sh +++ b/volume-backup.sh @@ -1,8 +1,10 @@ #!/bin/sh usage() { - >&2 echo "Usage: volume-backup " - exit 1 + >&2 echo "Usage: volume-backup [options] " + >&2 echo "" + >&2 echo "Options:" + >&2 echo " -e exclude files or directories (only for backup operation)" } backup() { @@ -15,7 +17,7 @@ backup() { mkdir -p `dirname /backup/$ARCHIVE` fi - tar -cjf $ARCHIVE_PATH -C /volume ./ + tar -cjf $ARCHIVE_PATH -C /volume $TAROPTS ./ } restore() { @@ -27,7 +29,7 @@ restore() { fi rm -rf /volume/* /volume/..?* /volume/.[!.]* - tar -C /volume/ -xjf $ARCHIVE_PATH + tar -C /volume/ -xjf $TAROPTS $ARCHIVE_PATH } # Needed because sometimes pty is not ready when executing docker-compose run @@ -35,17 +37,39 @@ restore() { # TODO: remove after above pull request or equivalent is merged sleep 1 -if [ $# -ne 2 ]; then - usage -fi - OPERATION=$1 -if [ "$2" == "-" ]; then - ARCHIVE=$2 +TAROPTS="" + +OPTIND=2 + +while getopts "h?e:" OPTION; do + case "$OPTION" in + h|\?) + usage + exit 0 + ;; + e) if [ -z "$OPTARG" -o "$OPERATION" != "backup" ]; then + usage + exit 1 + fi + TAROPTS="$TAROPTS --exclude $OPTARG" + ;; + esac +done + +shift $((OPTIND - 1)) + +if [ $# -lt 1 ]; then + usage + exit 1 +fi + +if [ "$1" == "-" ]; then + ARCHIVE=$1 ARCHIVE_PATH=$ARCHIVE else - ARCHIVE=${2%%.tar.bz2}.tar.bz2 + ARCHIVE=${1%%.tar.bz2}.tar.bz2 ARCHIVE_PATH=/backup/$ARCHIVE fi