Skip to content

Instantly share code, notes, and snippets.

@stanislavb
Last active February 10, 2023 16:34
Show Gist options
  • Save stanislavb/5575d160e46885e87fa4 to your computer and use it in GitHub Desktop.
Save stanislavb/5575d160e46885e87fa4 to your computer and use it in GitHub Desktop.
Backup and restore MongoDB running in a Docker container
#!/bin/bash
usage() {
echo "Usage $0 -c mongo_docker_container_name"
}
while [[ $# > 1 ]]
do
key="$1"
case $key in
-c|--container)
CONTAINERNAME="$2"
shift # past argument
;;
*)
usage
exit 1
;;
esac
shift # past argument or value
done
if [ -z "${CONTAINERNAME}" ]; then
usage
exit 1
fi
# -i interactive
# -t open TTY
# --rm remove container after use
# --name name of our temporary container
# --link map server container to hostname within client container
# mongo use official mongo image
# command line to run:
# mongo --host <hostname>
docker run -it --rm --name mongoconsole --link ${CONTAINERNAME}:${CONTAINERNAME} mongo mongo --host ${CONTAINERNAME}
#!/bin/bash
usage() {
echo "Usage $0 -c mongo_docker_container_name -db db_name"
}
while [[ $# > 1 ]]
do
key="$1"
case $key in
-db|--database)
DBNAME="$2"
shift # past argument
;;
-c|--container)
CONTAINERNAME="$2"
shift # past argument
;;
*)
usage
exit 1
;;
esac
shift # past argument or value
done
if [ -z "${DBNAME}" -o -z "${CONTAINERNAME}" ]; then
usage
exit 1
fi
docker run -it --name mongodump --link ${CONTAINERNAME}:${CONTAINERNAME} mongo mongodump --db ${DBNAME} --host ${CONTAINERNAME}
docker cp mongodump:dump ./mongodump-$(date --iso-8601)
if [ $? -ne 0 ]; then
echo "MongoDB did not succeed taking a backup. Did you specify the correct database name?"
fi
# Clean up container
docker rm mongodump
#!/bin/bash
# Use > 1 to consume two arguments per pass in the loop (e.g. each
# argument has a corresponding value to go with it).
# Use > 0 to consume one or more arguments per pass in the loop (e.g.
# some arguments don't have a corresponding value to go with it)
usage() {
echo "Usage $0 -d /mongodump/dir -c mongo_docker_container_name"
}
while [[ $# > 1 ]]
do
key="$1"
case $key in
-d|--dump)
DUMPDIR="$2"
shift # past argument
;;
-c|--container)
CONTAINERNAME="$2"
shift # past argument
;;
*)
usage
exit 1
;;
esac
shift # past argument or value
done
if [ -z "${DUMPDIR}" -o -z "${CONTAINERNAME}" ]; then
usage
exit 1
fi
echo "Attempting to restore mongodb dump at ${DUMPDIR} into container ${CONTAINERNAME}"
read -r -p "Is this what you want? [y/N] " response
case $response in
[yY][eE][sS]|[yY])
docker run -it --rm --name mongorestore -v ${DUMPDIR}:/var/dump --link ${CONTAINERNAME}:${CONTAINERNAME} mongo mongorestore --host ${CONTAINERNAME} /var/dump
;;
*)
echo "Nevermind then"
;;
esac
@fvbock
Copy link

fvbock commented Mar 15, 2017

hi @stanislvb

helpful scripts! thx.

getting a permission denied error on mongodump

./mongodump.sh -c k8s_mongo.93f51057_mongo-615685261-lghl7_default_6de7ee45-0952-11e7-a1b3-08002721bc79_077c43b5 -db foobar
2017-03-15T13:06:44.735+0000    Failed: error dumping metadata: error creating directory for metadata file dump/foobar mkdir dump: permission denied

tried running it with --privileged but same effect.

using -o /tmp/dump for the mongorestore command worked, but i wonder why it did not work in my case... i am running a minikube (local kubernetes cluster) - maybe that's got something to do with it?

cheers
_f
@

@nguni52
Copy link

nguni52 commented Jul 21, 2017

I was getting the same error doing the docker dump but when adding the -o /tmp/dump worked.

@pjanuario
Copy link

I used the docker restore script without issues! 👍

@leonroy
Copy link

leonroy commented Jul 12, 2020

the restore script needed a little tweaking on our environment to accomodate a separate Docker network for the MongoDB instance and also because since Mongo 3.0 you have to pass the --db flag to mongorestore. Updated script is:

#!/bin/bash
# Use > 1 to consume two arguments per pass in the loop (e.g. each
# argument has a corresponding value to go with it).
# Use > 0 to consume one or more arguments per pass in the loop (e.g.
# some arguments don't have a corresponding value to go with it)

usage() {
    echo "Usage $0 -d /mongodump/dir -c mongo_docker_container_name -n network_name -D dest_database"
}

while [[ $# > 1 ]]
do
key="$1"

case $key in
    -d|--dump)
        DUMPDIR="$2"
        shift # past argument
        ;;
    -c|--container)
        CONTAINERNAME="$2"
        shift # past argument
        ;;
    -n|--network)
        NETWORK="$2"
        shift # past argument
        ;;
    -D|--database)
        DATABASE="$2"
        shift # past argument
        ;;
    *)
    	usage
	exit 1
    	;;
esac
shift # past argument or value
done

if [ -z "${DUMPDIR}" -o -z "${CONTAINERNAME}" ]; then
    usage
    exit 1
fi

echo "Attempting to restore mongodb dump at ${DUMPDIR} into container ${CONTAINERNAME}"
read -r -p "Is this what you want? [y/N] " response
case $response in
    [yY][eE][sS]|[yY])
	docker run -it --rm --name mongorestore -v ${DUMPDIR}:/var/dump --link ${CONTAINERNAME}:${CONTAINERNAME} --network ${NETWORK} mongo mongorestore --host ${CONTAINERNAME} --db ${DATABASE} /var/dump
        ;;
    *)
        echo "Nevermind then"
        ;;
esac

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment