├── .dockerignore ├── Dockerfile ├── backup.sh ├── functions.sh └── README.md /.dockerignore: -------------------------------------------------------------------------------- 1 | .* 2 | Dockerfile 3 | *.md 4 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:latest 2 | 3 | ENV DEBIAN_FRONTEND noninteractive 4 | 5 | RUN apt-get update -y -q && \ 6 | apt-get install -y mysql-client-5.6 nodejs-legacy curl wget npm && \ 7 | apt-get clean && \ 8 | rm -rf /var/lib/apt/lists/* 9 | 10 | RUN npm install -g n azure-cli 11 | RUN n 0.12.7 12 | 13 | RUN mkdir -p /backup 14 | ADD . /backup 15 | RUN chmod 0755 /backup/* 16 | 17 | ENTRYPOINT ["/backup/backup.sh"] 18 | -------------------------------------------------------------------------------- /backup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ "$BACKUP_WINDOW" == "" ]; then 4 | 5 | BACKUP_WINDOW="0 6 * * * "; 6 | 7 | fi 8 | 9 | if [ "$ONE_SHOOT" == "true" ]; then 10 | 11 | . /backup/functions.sh; 12 | exit 0 13 | 14 | else 15 | 16 | sed 's,{{MYSQL_HOST}},'"${MYSQL_HOST}"',g' -i /backup/functions.sh 17 | sed 's,{{MYSQL_PORT}},'"${MYSQL_PORT}"',g' -i /backup/functions.sh 18 | sed 's,{{DB_USER}},'"${DB_USER}"',g' -i /backup/functions.sh 19 | sed 's,{{DB_PASSWORD}},'"${DB_PASSWORD}"',g' -i /backup/functions.sh 20 | sed 's,{{DB_NAME}},'"${DB_NAME}"',g' -i /backup/functions.sh 21 | sed 's,{{DEBUG}},'"${DEBUG}"',g' -i /backup/functions.sh 22 | sed 's,{{AZURE_STORAGE_ACCOUNT}},'"${AZURE_STORAGE_ACCOUNT}"',g' -i /backup/functions.sh 23 | sed 's,{{AZURE_STORAGE_ACCESS_KEY}},'"${AZURE_STORAGE_ACCESS_KEY}"',g' -i /backup/functions.sh 24 | sed 's,{{FILENAME}},'"${FILENAME}"',g' -i /backup/functions.sh 25 | sed 's,{{CONTAINER}},'"${CONTAINER}"',g' -i /backup/functions.sh 26 | touch /var/log/cron.log; 27 | echo "$BACKUP_WINDOW /backup/variable.sh & /backup/functions.sh >> /var/log/cron.log 2>&1" >> job; 28 | echo "" >> job 29 | crontab job; cron; 30 | tail -f /var/log/cron.log; 31 | exit $? 32 | 33 | fi 34 | -------------------------------------------------------------------------------- /functions.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | DATETIME=`date +"%Y-%m-%d_%H"` 4 | 5 | if [ "$MYSQL_PORT" == "" ]; then 6 | export MYSQL_PORT="3306"; 7 | fi 8 | 9 | if [ "$FILENAME" == "" ]; then 10 | export FILENAME="default"; 11 | fi 12 | 13 | if [ "$NO_PASSWORD" == "" ]; then 14 | export NO_PASSWORD="false"; 15 | fi 16 | 17 | make_backup () { 18 | 19 | export FILENAME={{FILENAME}} 20 | export CONTAINER={{CONTAINER}} 21 | export MYSQL_HOST={{MYSQL_HOST}} 22 | export MYSQL_PORT={{MYSQL_PORT}} 23 | export DB_USER={{DB_USER}} 24 | export DB_PASSWORD={{DB_PASSWORD}} 25 | export DB_NAME={{DB_NAME}} 26 | export DEBUG={{DEBUG}} 27 | export AZURE_STORAGE_ACCOUNT={{AZURE_STORAGE_ACCOUNT}} 28 | export AZURE_STORAGE_ACCESS_KEY={{AZURE_STORAGE_ACCESS_KEY}} 29 | 30 | if [ "$DEBUG" == "true" ]; then 31 | echo "######################################" 32 | echo "FILENAME = $FILENAME" 33 | echo "CONTAINER = $CONTAINER" 34 | echo "MYSQL_HOST = $MYSQL_HOST" 35 | echo "MYSQL_PORT = $MYSQL_PORT" 36 | echo "DB_USER = $DB_USER" 37 | echo "DB_PASSWORD = $DB_PASSWORD" 38 | echo "AZURE_STORAGE_ACCOUNT = $AZURE_STORAGE_ACCOUNT" 39 | echo "AZURE_STORAGE_ACCESS_KEY = $AZURE_STORAGE_ACCESS_KEY " 40 | echo "DB_NAME = $DB_NAME" 41 | echo "######################################" 42 | fi 43 | 44 | if [ "$NO_PASSWORD" == "true" ]; then 45 | 46 | mysqldump -h $MYSQL_HOST -P $MYSQL_PORT -u $DB_USER $DB_NAME > $FILENAME-$DATETIME.sql; 47 | 48 | else 49 | 50 | mysqldump -h $MYSQL_HOST -P $MYSQL_PORT -u $DB_USER --password=$DB_PASSWORD $DB_NAME > $FILENAME-$DATETIME.sql; 51 | 52 | fi 53 | 54 | # exit if last command have problems 55 | if [ "$?" != "0" ]; then 56 | echo "Error occurred in database dump process. Exiting now" 57 | exit 1 58 | fi 59 | # compress the file 60 | gzip -9 $FILENAME-$DATETIME.sql 61 | # Send to cloud storage 62 | /usr/local/bin/azure storage blob upload $FILENAME-$DATETIME.sql.gz $CONTAINER -c "DefaultEndpointsProtocol=https;BlobEndpoint=https://$AZURE_STORAGE_ACCOUNT.blob.core.windows.net/;AccountName=$AZURE_STORAGE_ACCOUNT;AccountKey=$AZURE_STORAGE_ACCESS_KEY" 63 | 64 | if [ "$?" != "0" ]; then 65 | exit 1 66 | fi 67 | # Remove file to save space 68 | rm -fR *.sql.gz 69 | 70 | } 71 | 72 | make_backup; 73 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Docker-mysql-backup-azure 2 | 3 | container to backup your mysql database's to Microsoft Azure Storare. 4 | 5 | # Container startup explained 6 | 7 | * You can run this container in 2 modes: 8 | - ONE_SHOOT - the container will backup your db and stop 9 | - CONTINUOUS - the container will start and use a cronjob to schedule a backup window and will run until you stop it. 10 | * Mysql will acess to the host where is database you want to backup 11 | * Mysql will dump the database to this container and compress it using gzip 12 | * Using azure-cli the file will be uploaded to Azure Storage 13 | 14 | # Environment variables 15 | 16 | - _`$DB_PASSWORD`_ - The password to connect with Mysql 17 | - _`$DB_USER`_ - The username to connect with Mysql 18 | - _`$DB_NAME`_ - Database name 19 | - _`$CONTAINER`_ - Container name in azure 20 | - _`$AZURE_STORAGE_ACCOUNT`_ - Name of Azure Storare Account 21 | - _`$AZURE_STORAGE_ACCESS_KEY`_ - Acess Key for Storage Account 22 | - _`$MYSQL_PORT`_ - Port to connect with Mysql. default 3306 23 | - _`$MYSQL_HOST`_ - Host where mysql is running 24 | - _`$FILENAME`_ - Name to file in Azure Storage. Default name `default-date +"%Y-%m-%d_%H-%M"` output example `default-2015-08-03_17-58` 25 | - _`$ONE_SHOOT`_ - If true the container make the backup and exit, else the container still running and schedule a job in crontab. default false 26 | a backup window. 27 | - _`$BACKUP_WINDOW`_ - What time should backup run. you should use crontab format, so see [documentation](http://www.freebsd.org/cgi/man.cgi?crontab(5). default value every day at 6 am. 28 | - _`$DEBUG`_ - If true will give you the value of all variables in terminal. default to false 29 | - _`$NO_PASSWORD`_ - Connect to Mysql-Host without password, default to false 30 | 31 | 32 | 33 | # Example of running 34 | 35 | ```bash 36 | docker run -rm --name mysql-backup \ 37 | -e "DB_PASSWORD=backup" \ 38 | -e "DB_USER=backup" \ 39 | -e "DB_NAME=backup" \ 40 | -e "ONE_SHOOT=true" \ 41 | -e "FILENAME=backup" 42 | -e "AZURE_STORAGE_ACCOUNT=teste-azure" 43 | -e "AZURE_STORAGE_ACCESS_KEY=ashdgashdgasdsa--dadcdsfsd/sdfd--" 44 | -e "CONTAINER=sql-backup" \ 45 | -e "MYSQL_HOST=test.mysql.com" \ 46 | fernandoneto/docker-mysql-backup-azure:latest 47 | 48 | ``` 49 | 50 | This will upload to Azure Storare a file named `default-2015-08-04_09-47.sql.gz` and after that the 51 | container will stop. 52 | 53 | ### Building image 54 | 55 | ```bash 56 | docker build -t fernandoneto/docker-mysql-backup-azure . 57 | ``` 58 | --------------------------------------------------------------------------------