https://hub.docker.com/r/fradelg/mysql-cron-backup

https://www.github.com/fradelg/docker-mysql-cron-backup

mysqlbak

34.domsn.com:5000/http:mysqlbak-20191201

变量:

MYSQL_HOST = mysql

MYSQL_USER  = ihunter

MYSQL_PASS  = wdqdmm@m

MAX_BACKUPS   = 5

INIT_BACKUP = 1

CRON_TIME  = 0 3* * *

卷:

/etc/localtime:/etc/localtime:ro

/data/file:/data/file

/data/file/mysql:/backup


备注:

MYSQL_DB:  默认 --all-databases。

CRON_TIME: 运行mysqldump的cron作业的间隔。不带冒号。

MAX_BACKUPS: 要保留的备份数量。达到极限时,旧备份将被丢弃。默认情况下没有限制。

INIT_BACKUP:  如果已设置,则在容器启动时创建备份。

INIT_RESTORE_LATEST:  如果已设置,则恢复最新的备份。

MYSQLDUMP_OPTS:  传递给mysqldump的命令行参数, 如: --single-transaction。

备份目录:   /backup

要从某个备份还原数据库,只需运行: /restore.sh /backup/201708060500.my_db.sql.gz


cd   /data/docker/Dockerfile/mysqlbak


vi  /data/docker/tools/Dockerfile/mysqlbak/Dockerfile

FROM alpine:latest
LABEL maintainer "ihunter@vip.qq.com"
RUN apk update
RUN apk --update --no-cache add bash tzdata ca-certificates 
RUN apk --update --no-cache add net-tools git curl axel wget vim  unzip zip geoip cmake autoconf automake libtool go gcc g++ 
RUN apk --update --no-cache add bash mysql-client gzip openssl 
RUN cp -r -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN apk upgrade
RUN rm -rf /var/cache/apk/*
ENV CRON_TIME="0 3 * * *" 
COPY ["run.sh", "backup.sh", "restore.sh", "/"]
RUN mkdir /backup && chmod u+x /backup.sh /restore.sh
VOLUME ["/backup"]
CMD /run.sh


vi  /data/docker/tools/Dockerfile/mysqlbak/run.sh

#!/bin/bash
touch /mysql_backup.log
tail -F /mysql_backup.log &
if [ "${INIT_BACKUP}" -gt "0" ]; then
  echo "=> Create a backup on the startup"
  /backup.sh
elif [ -n "${INIT_RESTORE_LATEST}" ]; then
  echo "=> Restore latest backup"
  until nc -z "$MYSQL_HOST" "$MYSQL_PORT"
  do
      echo "waiting database container..."
      sleep 1
  done
find /backup -maxdepth 1 -name '*.sql.gz' | tail -1 | xargs /restore.sh
fi
echo "${CRON_TIME} /backup.sh >> /mysql_backup.log 2>&1" > /crontab.conf
crontab /crontab.conf
echo "=> Running cron task manager"
exec crond -f


vi  /data/docker/Dockerfile/mysqlbak/backup.sh

#!/bin/bash
[ -z "${MYSQL_USER}" ] && { echo "=> MYSQL_USER cannot be empty" && exit 1; }
[ -z "${MYSQL_PASS:=$MYSQL_PASSWORD}" ] && { echo "=> MYSQL_PASS cannot be empty" && exit 1; }
DATE=$(date +%Y%m%d%H%M)
echo "=> Backup started at $(date "+%Y-%m-%d %H:%M:%S")"
DATABASES=${MYSQL_DATABASE:-${MYSQL_DB:-$(mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" -e "SHOW DATABASES;" | tr -d "| " | grep -v Database)}}
DB_COUNTER=0
for db in ${DATABASES}
do
  if [[ "$db" != "information_schema" ]] && [[ "$db" != "performance_schema" ]] && [[ "$db" != "mysql" ]] && [[ "$db" != _* ]]
  then
    echo "==> Dumping database: $db"
    FILENAME=/backup/$DATE.$db.sql
    LATEST=/backup/latest.$db.sql.gz
    if mysqldump -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" --databases "$db" $MYSQLDUMP_OPTS > "$FILENAME"
    then
      gzip -f "$FILENAME"
      echo "==> Creating symlink to latest backup: $(basename "$FILENAME".gz)"
      rm "$LATEST" 2> /dev/null
      cd /backup && ln -s $(basename "$FILENAME".gz) $(basename "$LATEST") && cd -
      DB_COUNTER=$(( DB_COUNTER + 1 ))
    else
      rm -rf "$FILENAME"
    fi
  fi
done
if [ -n "$MAX_BACKUPS" ]
then
  MAX_FILES=$(( MAX_BACKUPS * DB_COUNTER ))
  while [ "$(find /backup -maxdepth 1 -name "*.sql.gz" -type f | wc -l)" -gt "$MAX_FILES" ]
  do
    TARGET=$(find /backup -maxdepth 1 -name "*.sql.gz" -type f | sort | head -n 1)
    echo "==> Max number of backups ($MAX_BACKUPS) reached. Deleting ${TARGET} ..."
    rm -rf "${TARGET}"
    echo "==> Backup ${TARGET} deleted"
  done
fi
echo "=> Backup process finished at $(date "+%Y-%m-%d %H:%M:%S")"
chmod -R 777 /backup


vi  /data/docker/tools/Dockerfile/mysqlbak/restore.sh

#!/bin/bash
[ -z "${MYSQL_USER}" ] && { echo "=> MYSQL_USER cannot be empty" && exit 1; }
[ -z "${MYSQL_PASS}" ] && { echo "=> MYSQL_PASS cannot be empty" && exit 1; }
if [ "$#" -ne 1 ]
then
    echo "You must pass the path of the backup file to restore"
fi
echo "=> Restore database from $1"
set -o pipefail
if gunzip --stdout "$1" | mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS"
then
    echo "=> Restore succeeded"
else
    echo "=> Restore failed"
fi


docker build -t mysqlbak .

docker tag mysqlbak:latest 34.domsn.com:5000/http:mysqlbak-20191201

docker push 34.domsn.com:5000/http:mysqlbak-20191201


签名:这个人很懒,什么也没有留下!
最新回复 (0)
返回