in the middle of the work for authentication
This commit is contained in:
129
scripts/docker-backup.sh
Executable file
129
scripts/docker-backup.sh
Executable file
@@ -0,0 +1,129 @@
|
||||
#!/bin/bash -e
|
||||
|
||||
function get-volumes() {
|
||||
local vols=""
|
||||
for vol in ${*}; do
|
||||
local vf=$(docker inspect -f '{{.HostConfig.VolumesFrom}}' ${vol} | sed -n 's,^\[\(.*\)\]$,\1,p')
|
||||
if test -n "$vf"; then
|
||||
vols+=" "$(get-volumes $vf)
|
||||
fi
|
||||
vols+=" "$(docker inspect -f '{{.Config.Volumes}}' ${vol} | sed -n 's,^map\[\(.*\)\]$,\1,p' | sed 's,:[^ ]*,,g')
|
||||
done
|
||||
echo ${vols} | tr '[ ]' '[\n]' | sort | uniq | tr '[\n]' '[ ]'
|
||||
}
|
||||
|
||||
backup=""
|
||||
volumes=""
|
||||
infile=""
|
||||
tofile=""
|
||||
toserver=""
|
||||
tocontainer=""
|
||||
while test $# -gt 0; do
|
||||
case "$1" in
|
||||
(-h|--help)
|
||||
cat <<EOF
|
||||
$0 -b [OPTIONS]
|
||||
|
||||
OPTIONS:
|
||||
-b, --backup <container> name of the docker container to backup
|
||||
-v, --volume <volume> add volume path to backup from container
|
||||
-a, --auto automatically detect volumes to backup from container
|
||||
-i, --in-file <file> take already existing backup file to import
|
||||
-s, --to-server <server> copy backup to docker instance on ssh server
|
||||
-c, --to-container <container> write backup into container on ssh server
|
||||
-o, --to-file <file> write backup to file
|
||||
|
||||
DESCRIPTION:
|
||||
|
||||
Take docker backups and copy them to a file or restore them into a
|
||||
docker instance on an ssh target server.
|
||||
|
||||
Note: Use ssh key exchange to prevent password query.
|
||||
Note: Only volume paths are backed-up correctly
|
||||
|
||||
EXAMPLE:
|
||||
|
||||
$0 -b wordpress -a -o /tmp/wordpress.bak.tar.bz2
|
||||
$0 -i /tmp/wordpress.bak.tar.bz2 -c wordpress
|
||||
$0 -b backup-test -a -s server -c backup-test
|
||||
|
||||
EOF
|
||||
exit 0
|
||||
;;
|
||||
(-b|--backup)
|
||||
shift
|
||||
backup="$1"
|
||||
;;
|
||||
(-i|--in-file)
|
||||
shift
|
||||
infile="$1"
|
||||
;;
|
||||
(-o|--to-file)
|
||||
shift
|
||||
tofile="$1"
|
||||
;;
|
||||
(-s|--to-server)
|
||||
shift
|
||||
toserver="$1"
|
||||
;;
|
||||
(-c|--to-container)
|
||||
shift
|
||||
tocontainer="$1"
|
||||
;;
|
||||
(-a|--auto)
|
||||
if test -z "$backup"; then
|
||||
echo "**** Error: --auto first requires --backup, try $0 --help" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
volumes+=" "$(get-volumes $backup)
|
||||
;;
|
||||
(-v|--volume)
|
||||
shift
|
||||
volumes+=("$1")
|
||||
;;
|
||||
(*)
|
||||
echo "**** Error: unknown argument $1, try $0 --help" 1>&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
if test $# -eq 0; then
|
||||
echo "**** Error: missing argument, try $0 --help" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
shift
|
||||
done
|
||||
|
||||
if test -n "$backup"; then
|
||||
if test -z "${volumes}"; then
|
||||
echo "**** Error: no volumes to backup, try $0 --help" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
elif test -z "$infile"; then
|
||||
echo "**** Error: no input source specified, try $0 --help" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
if test -n "$toserver"; then
|
||||
if test -z "$tocontainer"; then
|
||||
echo "**** Error: no target container specified, try $0 --help" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
elif test -z "$tofile" -a -z "$tocontainer";then
|
||||
echo "**** Error: no target specified, try $0 --help" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
(
|
||||
if test -n "$backup"; then
|
||||
docker run --rm -i -w / --volumes-from $backup ubuntu tar cjP ${volumes}
|
||||
elif test -n "$infile"; then
|
||||
cat "$infile"
|
||||
fi
|
||||
) | (
|
||||
if test -n "$toserver"; then
|
||||
ssh $toserver docker run --rm -i -w / --volumes-from $tocontainer ubuntu tar xjP
|
||||
elif test -n "$tocontainer"; then
|
||||
docker run --rm -i -w / --volumes-from $tocontainer ubuntu tar xjP
|
||||
elif test -n "$tofile";then
|
||||
cat > "$tofile"
|
||||
fi
|
||||
)
|
Reference in New Issue
Block a user