HOWTO
Backup mysql/mariadb databases with optional on the fly encryption and mail report.
TAGS
- latest, 8
- 5, 5.7
- alpine
NOTICE: tags 5, 5.7, alpine do not support mysql 8 and tags latest, 8 do not support mysql 5 and mariadb.
Environment Variables
Override them according to your requirements.
BACKUP_ROOTDIR # default = /backup
MYSQL_HOST # REQUIRED [also used to name the backup dir eg. '/backup/$MYSQL_HOST']
MYSQL_PASSWD[_FILE] # REQUIRED
MYSQL_PORT # default = 3306
MYSQL_PROTO # default = TCP [options=TCP, SOCKET]
MYSQL_USER # default = root
MYSQL_OPTIONS # default = '--single-transaction' (override it and provide any option you need)
DATABASES # default = all [or 'db1 db2 db3' multiple databases separated by SPACES]
COMPRESS # default = YES [options=YES, NO]
CMD_COMPRESS # default = 'bzip2 -9' [options=bzip2, gzip, xz]
SWARM_SERVICE # default = unset [use this to prepend with an underscore, the service name, in the backup dir eg. '/backup/$SWARM_SERVICE_$MYSQL_HOST']
SLEEP_SCHEDULE # default = 0 [run once and exit] if you want to use SLEEP
or
CRON_SCHEDULE # default = 0 [run once and exit]* if you want to use CRON
ENC # default = NO [options=YES, NO]
CIPHER # default = -aes-256-cbc
CERT_LOC # default = /run/secrets/mysql_backup_cert
MAILTO # REQUIRED [for the mail functionality]
MSMTPRC # default = /etc/msmtprc [where msmtp gets the mail settings]
MSMTP_ACCOUNT_NAME # default = sql-dump [account identity in msmtprc]
SMTP_HOST # REQUIRED [eg. smtp.gmail.com]
SMTP_PORT # REQUIRED [eg. 587]
SMTP_USER # REQUIRED [eg. username@gmail.com]
SMTP_PASSWD[_FILE] # REQUIRED [eg. plain-text-password]
MAILFROM # REQUIRED [eg. username@gmail.com]
* For CRON_SCHEDULE use proper cron format like: '0 0 * * *' every day at 12:00am
* Use MYSQL_PASSWD_FILE and/or SMTP_PASSWD_FILE with swarm secrets
Encryption
Encrypt your backups on the fly using openssl.
You need a self-signed certificate to encrypt the backup and your private key to decrypt it.
You can find a tutorial in this gist.
Examples
# run once and exit - mysql-prod is the container running the db we want to backup
$ docker run --rm --link mysql-prod -e MYSQL_PASSWD=password -e MYSQL_HOST=mysql-prod ioagel/mysql-backup
# Use SLEEP
# run as a daemon and backup every 1 hour
# $ docker run -d --link mysql-prod -e MYSQL_PASSWD=password -e MYSQL_HOST=mysql-prod -e SLEEP_SCHEDULE=3600 -v db_backups:/backup ioagel/mysql-backup
# or backup every 3h (10800 seconds)
# $ docker run -d --link mysql-prod -e MYSQL_PASSWD=password -e MYSQL_HOST=mysql-prod -e SLEEP_SCHEDULE=10800 -v db_backups:/backup ioagel/mysql-backup
# or backup every 3h (only supported in LINUX)
# $ docker run -d --link mysql-prod -e MYSQL_PASSWD=password -e MYSQL_HOST=mysql-prod -e SLEEP_SCHEDULE=3h -v db_backups:/backup ioagel/mysql-backup
#
# OR
#
# Use CRON
# run as a daemon and backup every 1 hour
# $ docker run -d --link mysql-prod -e MYSQL_PASSWD=password -e MYSQL_HOST=mysql-prod -e CRON_SCHEDULE='0 * * * *' -v db_backups:/backup ioagel/mysql-backup
# or backup once every day at 12:00am
# $ docker run -d --link mysql-prod -e MYSQL_PASSWD=password -e MYSQL_HOST=mysql-prod -e CRON_SCHEDULE='0 0 * * *' -v db_backups:/backup ioagel/mysql-backup
# Encryption
$ docker run --rm --link mysql-prod -e MYSQL_PASSWD=password -e MYSQL_HOST=mysql-prod -e ENC=YES -v $PWD/cert.pem:/run/secrets/mysql_backup_cert -v db_backups:/backup ioagel/mysql-backup
# backup remote docker container or standalone mysql server
$ docker run --rm -e MYSQL_HOST=mysql.example.org -e MYSQL_PASSWD=password -v db_backups:/backup ioagel/mysql-backup