MongoDB backup within docker container
Here’s a pet project I’m working on - It is a simple blog engine written in java 8 that uses mongodb as a primary database. I was pretty excited about docker when I heard about it for the first time. Recently, I wrote a small article describing docker essentials - it’s a post showing basic fundamental commands that you can use when working with docker.
Today I’m going to share the scripts I wrote to make and restore backups of a mongodb database. I was surprised that I didn’t find anything similar on google so I hope somebody finds these scripts helpful.
Backup
rm -rf /tmp/mongodump && mkdir /tmp/mongodump
docker run -it --rm --link mongo:mongo -v /tmp/mongodump:/tmp mongo bash -c 'mongodump -v --host $MONGO_PORT_27017_TCP_ADDR:$MONGO_PORT_27017_TCP_PORT --db '$1' --out=/tmp'
tar -cvf $2 -C /tmp/mongodump *
rm -rf /tmp/mongodump
If you name your container something other than mongo
, you need to change the link parameter from mongo:mongo
to [name]:mongo
. Also, if you don’t use the default port (27017), you’ll need to modify the variables $MONGO_PORT_27017_TCP_ADDR
and $MONGO_PORT_27017_TCP_PORT
.
You can now use it as follows:
./mongo-backup.sh [database_name] ~/backup.tar
Now backup.tar
will contain all your collections packed in a tar
file.
Restoring
TMP_DIR="/tmp/mongorestore/"
rm -rf $TMP_DIR && mkdir $TMP_DIR
if [[ $1 =~ \.tar$ ]];
then
#FILENAME=$(echo $1 | sed 's/.*\///')
FILENAME=$2"/"
mkdir $TMP_DIR
echo "Data will be extracted into :"$TMP_DIR
tar -C $TMP_DIR -xvf $1
else
FILENAME=$(echo $1 | sed 's/.*\///')
cp $1 $TMP_DIR$FILENAME
fi
docker run -it --rm --link mongo:mongo -v $TMP_DIR:/tmp mongo bash -c 'mongorestore --drop -v --host $MONGO_PORT_27017_TCP_ADDR:$MONGO_PORT_27017_TCP_PORT --db '$2' /tmp/'$FILENAME
rm -rf $TMP_DIR
This script has two possible modes: tar restoring and collection restoring.
The first mode looks like this:
./mongo-restore.sh ~/backup.tar [database_name]
The second one may look like this:
./mongo-restore.sh ~/users.json [database_name]
If you want to help me improve my scripts, you can send me a pull request to this repository.