From 658751a5e4158149ee63cf8a9dc882212eae0d0c Mon Sep 17 00:00:00 2001
From: Jan Wagner <waja@cyconet.org>
Date: Sat, 8 Apr 2017 16:50:29 +0200
Subject: [PATCH 001/138] Adding Makefile for running tests via 'make test'

This can be used for local development and even for running at travis-ci.
---
 Makefile | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)
 create mode 100644 Makefile

diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..dc20422
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,25 @@
+# Makefile
+
+all: test
+
+test:
+	# Checking for syntax errors
+	set -e; for SCRIPT in *.sh; \
+	do \
+		sh -n $$SCRIPT; \
+	done
+
+	# Checking for bashisms (currently not failing, but only listing)
+	SCRIPT="$$(which checkbashisms)"; if [ -n "$$SCRIPT" ] && [ -x "$$SCRIPT" ]; \
+	then \
+		$$SCRIPT *.sh || true; \
+	else \
+		echo "WARNING: skipping bashism test - you need to install checkbashism."; \
+	fi
+
+	SCRIPT="$$(which shellcheck)"; if [ -n "$$SCRIPT" ] && [ -x "$$SCRIPT" ]; \
+	then \
+		$$SCRIPT *.sh || true; \
+	else \
+		echo "WARNING: skipping shellcheck test - you need to install shellcheck."; \
+	fi

From 47aa233806ccef6cf826eb3b210507349082d797 Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Sat, 8 Apr 2017 17:28:35 +0200
Subject: [PATCH 002/138] add travis for syntax checking

---
 .travis.yml | 10 ++++++++++
 1 file changed, 10 insertions(+)
 create mode 100644 .travis.yml

diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..4a5f109
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,10 @@
+sudo: required
+dist: xenial
+language: bash
+
+before_script:
+  - sudo apt-get -qq update
+  - sudo apt-get install -y devscripts shellcheck
+
+script:
+  - make test

From cedc1c36b3067e4eb0d7adb283fae16865876cc0 Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Sat, 8 Apr 2017 17:32:53 +0200
Subject: [PATCH 003/138] add travis build status badge

---
 README.md | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/README.md b/README.md
index f4d6865..fd4f511 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,8 @@
+[![Build Status](https://travis-ci.org/fradelg/docker-mysql-cron-backup.svg?branch=master)](https://travis-ci.org/fradelg/docker-mysql-cron-backup)
+
 # mysql-cron-backup
 
-This image runs mysqldump to backup database periodically using cron. Data is dumped to the container folder `/backup`
+This image runs mysqldump to backup your databases periodically using cron. Data is dumped to `/backup` so you can mount your backup volumes in this path.
 
 ## Usage:
 

From da419c79b116ad2c775a05e318357a6b0788b39b Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Sat, 8 Apr 2017 17:57:23 +0200
Subject: [PATCH 004/138] fix bash syntax accordint to shellcheck

---
 backup.sh  | 25 ++++++++++++++-----------
 restore.sh |  4 ++--
 run.sh     |  4 ++--
 3 files changed, 18 insertions(+), 15 deletions(-)

diff --git a/backup.sh b/backup.sh
index 4f90970..4492db5 100644
--- a/backup.sh
+++ b/backup.sh
@@ -2,27 +2,30 @@
 [ -z "${MYSQL_USER}" ] && { echo "=> MYSQL_USER cannot be empty" && exit 1; }
 [ -z "${MYSQL_PASS}" ] && { echo "=> MYSQL_PASS cannot be empty" && exit 1; }
 
-DATE=`date +%Y%m%d%H%M`
+DATE=$(date +%Y%m%d%H%M)
 echo "=> Backup started at $DATE"
-databases=`mysql -u $MYSQL_USER -p$MYSQL_PASS -e "SHOW DATABASES;" | tr -d "| " | grep -v Database`
+databases=$(mysql -u "$MYSQL_USER" -p"$MYSQL_PASS" -e "SHOW DATABASES;" | tr -d "| " | grep -v Database)
 for db in $databases; do
-  if [[ "$db" != "information_schema" ]] && [[ "$db" != "performance_schema" ]] && [[ "$db" != "mysql" ]] && [[ "$db" != _* ]] ; then
+  if [[ "$db" != "information_schema" ]] && [[ "$db" != "performance_schema" ]] && [[ "$db" != "mysql" ]] && [[ "$db" != _* ]]
+  then
     echo "Dumping database: $db"
     FILENAME=/backup/$DATE.$db.sql
-    if mysqldump -h $MYSQL_HOST -P $MYSQL_PORT -u $MYSQL_USER -p$MYSQL_PASS $db > $FILENAME ;then
-      gzip -f $FILENAME
+    if mysqldump -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" "$db" > "$FILENAME"
+    then
+      gzip -f "$FILENAME"
     else
-      rm -rf $FILENAME
+      rm -rf "$FILENAME"
     fi
   fi
 done
 
-if [ -n "$MAX_BACKUPS" ]; then
-  while [ `ls -1 /backup | wc -l` -gt "$MAX_BACKUPS" ];
+if [ -n "$MAX_BACKUPS" ]
+then
+  while [ $(find /backup -maxdepth 1 -name "*.sql.gz" | wc -l) -gt "$MAX_BACKUPS" ];
   do
-    TARGET=`ls -1 /backup | sort | head -n 1`
-    echo "Backup ${TARGET} is deleted"
-    rm -rf /backup/${TARGET}
+    TARGET=$(find /backup -maxdepth 1 -name "*.sql.gz" | sort | head -n 1)
+    echo "Backup $TARGET is deleted"
+    rm -rf /backup/"$TARGET"
   done
 fi
 
diff --git a/restore.sh b/restore.sh
index d9dd5c4..de67315 100644
--- a/restore.sh
+++ b/restore.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
-echo "=> Restore database from \$1"
-if mysql -h $MYSQL_HOST -P $MYSQL_POR -u $MYSQL_USER -p$MYSQL_PASS < \$1 ;then
+echo "=> Restore database from $1"
+if mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" < "$1" ;then
     echo "=> Restore succeeded"
 else
     echo "=> Restore failed"
diff --git a/run.sh b/run.sh
index 1d3fefa..f821cd6 100755
--- a/run.sh
+++ b/run.sh
@@ -7,12 +7,12 @@ if [ -n "${INIT_BACKUP}" ]; then
   /backup.sh
 elif [ -n "${INIT_RESTORE_LATEST}" ]; then
   echo "=> Restore latest backup"
-  until nc -z $MYSQL_HOST $MYSQL_PORT
+  until nc -z "$MYSQL_HOST" "$MYSQL_PORT"
   do
       echo "waiting database container..."
       sleep 1
   done
-  ls -d -1 /backup/* | tail -1 | xargs /restore.sh
+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

From fc86bcc4cd0707a05105240e3d392ab59aed2fce Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Sat, 8 Apr 2017 18:02:18 +0200
Subject: [PATCH 005/138] double quote find expression too

---
 backup.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/backup.sh b/backup.sh
index 4492db5..db1b2f9 100644
--- a/backup.sh
+++ b/backup.sh
@@ -21,7 +21,7 @@ done
 
 if [ -n "$MAX_BACKUPS" ]
 then
-  while [ $(find /backup -maxdepth 1 -name "*.sql.gz" | wc -l) -gt "$MAX_BACKUPS" ];
+  while [ "$(find /backup -maxdepth 1 -name "*.sql.gz" | wc -l)" -gt "$MAX_BACKUPS" ];
   do
     TARGET=$(find /backup -maxdepth 1 -name "*.sql.gz" | sort | head -n 1)
     echo "Backup $TARGET is deleted"

From 77703067507532e9366eb9a0616f7e4124f09c8c Mon Sep 17 00:00:00 2001
From: Jan Wagner <waja@cyconet.org>
Date: Mon, 10 Apr 2017 08:55:09 +0200
Subject: [PATCH 006/138] Removing absolute path, $TARGET includes it already.

---
 backup.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/backup.sh b/backup.sh
index db1b2f9..62bfaa0 100644
--- a/backup.sh
+++ b/backup.sh
@@ -25,7 +25,7 @@ then
   do
     TARGET=$(find /backup -maxdepth 1 -name "*.sql.gz" | sort | head -n 1)
     echo "Backup $TARGET is deleted"
-    rm -rf /backup/"$TARGET"
+    rm -rf "$TARGET"
   done
 fi
 

From 44cdee455a70c36540e71477721d65a836c6ea09 Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Sun, 16 Apr 2017 11:29:31 +0200
Subject: [PATCH 007/138] update docker and bash syntax

---
 README.md  | 18 +++++++++---------
 backup.sh  |  5 +++--
 restore.sh | 11 ++++++++++-
 3 files changed, 22 insertions(+), 12 deletions(-)

diff --git a/README.md b/README.md
index fd4f511..a3971b5 100644
--- a/README.md
+++ b/README.md
@@ -2,15 +2,15 @@
 
 # mysql-cron-backup
 
-This image runs mysqldump to backup your databases periodically using cron. Data is dumped to `/backup` so you can mount your backup volumes in this path.
+This docker image runs mysqldump to backup your databases periodically using cron task manager. Backups are placed in `/backup` so you can mount your backup docker volume in this path.
 
 ## Usage:
 
-  docker run -d \
-    --env MYSQL_USER=admin \
-    --env MYSQL_PASS=password \
+  docker container run -d \
+    --env MYSQL_USER=root \
+    --env MYSQL_PASS=my_password \
     --link mysql
-    --volume /path/to/my/host/folder:/backup
+    --volume /path/to/my/backup/folder:/backup
     fradelg/mysql-backup
 
 ## Variables
@@ -27,10 +27,10 @@ This image runs mysqldump to backup your databases periodically using cron. Data
 
 ## Restore from a backup
 
-See the list of backups, you can run:
+See the list of backups in your running docker container, just write in your favorite terminal:
 
-    docker exec backup ls /backup
+    docker container exec backup ls /backup
 
-To restore database from a certain backup, simply run:
+To restore a database from a certain backup, simply run:
 
-    docker exec backup /restore.sh /backup/2015.08.06.171901
+    docker container exec backup /restore.sh /backup/201708060500.my_db.sql.gz
diff --git a/backup.sh b/backup.sh
index 62bfaa0..f0d427c 100644
--- a/backup.sh
+++ b/backup.sh
@@ -5,7 +5,8 @@
 DATE=$(date +%Y%m%d%H%M)
 echo "=> Backup started at $DATE"
 databases=$(mysql -u "$MYSQL_USER" -p"$MYSQL_PASS" -e "SHOW DATABASES;" | tr -d "| " | grep -v Database)
-for db in $databases; do
+for db in $databases
+do
   if [[ "$db" != "information_schema" ]] && [[ "$db" != "performance_schema" ]] && [[ "$db" != "mysql" ]] && [[ "$db" != _* ]]
   then
     echo "Dumping database: $db"
@@ -21,7 +22,7 @@ done
 
 if [ -n "$MAX_BACKUPS" ]
 then
-  while [ "$(find /backup -maxdepth 1 -name "*.sql.gz" | wc -l)" -gt "$MAX_BACKUPS" ];
+  while [ "$(find /backup -maxdepth 1 -name "*.sql.gz" | wc -l)" -gt "$MAX_BACKUPS" ]
   do
     TARGET=$(find /backup -maxdepth 1 -name "*.sql.gz" | sort | head -n 1)
     echo "Backup $TARGET is deleted"
diff --git a/restore.sh b/restore.sh
index de67315..9657eba 100644
--- a/restore.sh
+++ b/restore.sh
@@ -1,6 +1,15 @@
 #!/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"
-if mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" < "$1" ;then
+if mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" < "$1"
+then
     echo "=> Restore succeeded"
 else
     echo "=> Restore failed"

From ae753e40a1736c32b19a0551cc36dba82f5feb30 Mon Sep 17 00:00:00 2001
From: "Markus \"Shorty\" Uckelmann" <markus.uckelmann@sevenval.com>
Date: Thu, 7 Sep 2017 17:10:15 +0200
Subject: [PATCH 008/138] Fixes missing USE statement in SQL dump

This commit adds the additional `--databases` option to the mysqldump command.
This adds a `USE database` statement to the beginning of the SQL dump.
Without this one has to provide the database name at restore.
---
 backup.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
 mode change 100644 => 100755 backup.sh

diff --git a/backup.sh b/backup.sh
old mode 100644
new mode 100755
index f0d427c..d2ca3dd
--- a/backup.sh
+++ b/backup.sh
@@ -11,7 +11,7 @@ do
   then
     echo "Dumping database: $db"
     FILENAME=/backup/$DATE.$db.sql
-    if mysqldump -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" "$db" > "$FILENAME"
+    if mysqldump -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" --databases "$db" > "$FILENAME"
     then
       gzip -f "$FILENAME"
     else

From 95c36b64933dc00176ab8f781ce09ac0bcb19212 Mon Sep 17 00:00:00 2001
From: "Markus \"Shorty\" Uckelmann" <markus.uckelmann@sevenval.com>
Date: Thu, 7 Sep 2017 17:18:55 +0200
Subject: [PATCH 009/138] Adds missing gunzip command

This commit adds a gunzip command which extracts the gzip'd SQL dump and
pipes it into the mysql command. Without the restore fails.
---
 restore.sh | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
 mode change 100644 => 100755 restore.sh

diff --git a/restore.sh b/restore.sh
old mode 100644
new mode 100755
index 9657eba..20561f2
--- a/restore.sh
+++ b/restore.sh
@@ -8,7 +8,8 @@ then
 fi
 
 echo "=> Restore database from $1"
-if mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" < "$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

From cf9e0bac0d97b83802b58b898c7906597d7dae75 Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Mon, 11 Sep 2017 09:36:38 +0200
Subject: [PATCH 010/138] merge COPY in Dockerfile

---
 Dockerfile | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/Dockerfile b/Dockerfile
index 19d4291..566dc54 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,5 +1,5 @@
-FROM alpine
-MAINTAINER Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>
+FROM alpine:3.5
+LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update bash mysql-client gzip && rm -rf /var/cache/apk/* && mkdir /backup
 
@@ -7,10 +7,8 @@ ENV CRON_TIME="0 3 * * sun" \
     MYSQL_HOST="mysql" \
     MYSQL_PORT="3306"
 
-COPY run.sh /run.sh
-COPY backup.sh /backup.sh
-COPY restore.sh /restore.sh
-RUN chmod +x /backup.sh /restore.sh
+COPY ["run.sh", "backup.sh", "restore.sh", "/"]
+RUN chmod u+x /backup.sh /restore.sh
 
 VOLUME ["/backup"]
 

From 5e1044ffeaa16c624081fa2753d790eb136dca2e Mon Sep 17 00:00:00 2001
From: Jan Wagner <waja@cyconet.org>
Date: Tue, 30 Jan 2018 08:23:18 +0100
Subject: [PATCH 011/138] Use correct image name

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index a3971b5..29086da 100644
--- a/README.md
+++ b/README.md
@@ -11,7 +11,7 @@ This docker image runs mysqldump to backup your databases periodically using cro
     --env MYSQL_PASS=my_password \
     --link mysql
     --volume /path/to/my/backup/folder:/backup
-    fradelg/mysql-backup
+    fradelg/mysql-cron-backup
 
 ## Variables
 

From 29b54da5a8f96bd0ae3fcf31ef8efd3e2392596e Mon Sep 17 00:00:00 2001
From: Jan Wagner <waja@cyconet.org>
Date: Tue, 30 Jan 2018 08:32:45 +0100
Subject: [PATCH 012/138] Update to apline 3.7

---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index 566dc54..a8c0300 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM alpine:3.5
+FROM alpine:3.7
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update bash mysql-client gzip && rm -rf /var/cache/apk/* && mkdir /backup

From 2b1d2e979aeb919d1f8b98ffef490dc9f35d2f75 Mon Sep 17 00:00:00 2001
From: Jan Wagner <waja@cyconet.org>
Date: Mon, 12 Feb 2018 15:43:58 +0100
Subject: [PATCH 013/138] Reorder Dockerfile for less layers

---
 Dockerfile | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/Dockerfile b/Dockerfile
index a8c0300..678e58e 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,15 +1,15 @@
 FROM alpine:3.7
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
-RUN apk add --update bash mysql-client gzip && rm -rf /var/cache/apk/* && mkdir /backup
+COPY ["run.sh", "backup.sh", "restore.sh", "/"]
+
+RUN apk add --update bash mysql-client gzip && rm -rf /var/cache/apk/* && mkdir /backup &&\
+  chmod u+x /backup.sh /restore.sh
 
 ENV CRON_TIME="0 3 * * sun" \
     MYSQL_HOST="mysql" \
     MYSQL_PORT="3306"
 
-COPY ["run.sh", "backup.sh", "restore.sh", "/"]
-RUN chmod u+x /backup.sh /restore.sh
-
 VOLUME ["/backup"]
 
 CMD ["/run.sh"]

From 596c12191319163807236568e0c1d682dbb8bfe6 Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Wed, 21 Mar 2018 13:08:51 +0100
Subject: [PATCH 014/138] use HOST and PORT for table lookup

---
 .travis.yml | 2 +-
 backup.sh   | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index 4a5f109..120a65f 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,5 +1,5 @@
 sudo: required
-dist: xenial
+dist: trusty
 language: bash
 
 before_script:
diff --git a/backup.sh b/backup.sh
index d2ca3dd..8de41a4 100755
--- a/backup.sh
+++ b/backup.sh
@@ -4,7 +4,7 @@
 
 DATE=$(date +%Y%m%d%H%M)
 echo "=> Backup started at $DATE"
-databases=$(mysql -u "$MYSQL_USER" -p"$MYSQL_PASS" -e "SHOW DATABASES;" | tr -d "| " | grep -v Database)
+databases=$(mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" -e "SHOW DATABASES;" | tr -d "| " | grep -v Database)
 for db in $databases
 do
   if [[ "$db" != "information_schema" ]] && [[ "$db" != "performance_schema" ]] && [[ "$db" != "mysql" ]] && [[ "$db" != _* ]]

From 2231e88e589451f5f23c40eba3730e1842b335ce Mon Sep 17 00:00:00 2001
From: Alan Colon <github@alanc.net>
Date: Thu, 26 Apr 2018 10:56:25 -0700
Subject: [PATCH 015/138] Implement MYSQL_DB and MYSQLDUMP_OPTS options. Accept
 MYSQL_DATABASE and MYSQL_PASSWORD to maintain parity with _/mysql image
 options.

---
 README.md | 1 +
 backup.sh | 6 +++---
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/README.md b/README.md
index 29086da..1a649b5 100644
--- a/README.md
+++ b/README.md
@@ -20,6 +20,7 @@ This docker image runs mysqldump to backup your databases periodically using cro
     MYSQL_USER      the username of your mysql database
     MYSQL_PASS      the password of your mysql database
     MYSQL_DB        the database name to dump. Default: `--all-databases`
+		MYSQLDUMP_OPTS  command line arguments to pass to mysqldump. Example: `--single-transaction`
     CRON_TIME       the interval of cron job to run mysqldump. `0 0 * * *` by default, which is every day at 00:00
     MAX_BACKUPS     the number of backups to keep. When reaching the limit, the old backup will be discarded. No limit by default
     INIT_BACKUP     if set, create a backup when the container starts
diff --git a/backup.sh b/backup.sh
index 8de41a4..4278fcd 100755
--- a/backup.sh
+++ b/backup.sh
@@ -1,17 +1,17 @@
 #!/bin/bash
 [ -z "${MYSQL_USER}" ] && { echo "=> MYSQL_USER cannot be empty" && exit 1; }
-[ -z "${MYSQL_PASS}" ] && { echo "=> MYSQL_PASS 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"
-databases=$(mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" -e "SHOW DATABASES;" | tr -d "| " | grep -v Database)
+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)}}
 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
-    if mysqldump -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" --databases "$db" > "$FILENAME"
+    if mysqldump -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" --databases "$db" $MYSQLDUMP_OPTS > "$FILENAME"
     then
       gzip -f "$FILENAME"
     else

From bcc8f68f723070a10ead5e67a62df0d6ea6ce0e9 Mon Sep 17 00:00:00 2001
From: Manuel <mmartinortiz@gmail.com>
Date: Thu, 8 Nov 2018 11:15:00 +0100
Subject: [PATCH 016/138] Create a link to the latest backup

The symlink is not considered a backup itself and never deleted according to the backup quota
---
 backup.sh | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/backup.sh b/backup.sh
index 4278fcd..2d7fcdd 100755
--- a/backup.sh
+++ b/backup.sh
@@ -11,9 +11,12 @@ do
   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"
+      rm "$LATEST"
+      ln -s "$FILENAME" "$LATEST"
     else
       rm -rf "$FILENAME"
     fi
@@ -22,9 +25,9 @@ done
 
 if [ -n "$MAX_BACKUPS" ]
 then
-  while [ "$(find /backup -maxdepth 1 -name "*.sql.gz" | wc -l)" -gt "$MAX_BACKUPS" ]
+  while [ "$(find /backup -maxdepth 1 -name "*.sql.gz" -type f | wc -l)" -gt "$MAX_BACKUPS" ]
   do
-    TARGET=$(find /backup -maxdepth 1 -name "*.sql.gz" | sort | head -n 1)
+    TARGET=$(find /backup -maxdepth 1 -name "*.sql.gz" -type f | sort | head -n 1)
     echo "Backup $TARGET is deleted"
     rm -rf "$TARGET"
   done

From f6e189e931e6a74b09614c46baf299889b6c8d32 Mon Sep 17 00:00:00 2001
From: Manuel <mmartinortiz@gmail.com>
Date: Thu, 8 Nov 2018 11:28:04 +0100
Subject: [PATCH 017/138] Aesthetics improvements and docker-compose example

---
 README.md | 80 ++++++++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 62 insertions(+), 18 deletions(-)

diff --git a/README.md b/README.md
index 1a649b5..f95276f 100644
--- a/README.md
+++ b/README.md
@@ -6,32 +6,76 @@ This docker image runs mysqldump to backup your databases periodically using cro
 
 ## Usage:
 
-  docker container run -d \
-    --env MYSQL_USER=root \
-    --env MYSQL_PASS=my_password \
-    --link mysql
-    --volume /path/to/my/backup/folder:/backup
-    fradelg/mysql-cron-backup
+```bash
+docker container run -d \
+       --env MYSQL_USER=root \
+       --env MYSQL_PASS=my_password \
+       --link mysql
+       --volume /path/to/my/backup/folder:/backup
+       fradelg/mysql-cron-backup
+```
 
 ## Variables
 
-    MYSQL_HOST      the host/ip of your mysql database
-    MYSQL_PORT      the port number of your mysql database
-    MYSQL_USER      the username of your mysql database
-    MYSQL_PASS      the password of your mysql database
-    MYSQL_DB        the database name to dump. Default: `--all-databases`
-		MYSQLDUMP_OPTS  command line arguments to pass to mysqldump. Example: `--single-transaction`
-    CRON_TIME       the interval of cron job to run mysqldump. `0 0 * * *` by default, which is every day at 00:00
-    MAX_BACKUPS     the number of backups to keep. When reaching the limit, the old backup will be discarded. No limit by default
-    INIT_BACKUP     if set, create a backup when the container starts
-    INIT_RESTORE_LATEST if set, restores latest backup
+- `MYSQL_HOST`: The host/ip of your mysql database.
+- `MYSQL_PORT`: The port number of your mysql database.
+- `MYSQL_USER`: The username of your mysql database.
+- `MYSQL_PASS`: The password of your mysql database.
+- `MYSQL_DB`: The database name to dump. Default: `--all-databases`.
+- `MYSQLDUMP_OPTS`: Command line arguments to pass to mysqldump. Example: `--single-transaction`.
+- `CRON_TIME`: The interval of cron job to run mysqldump. `0 3 * * sun` by default, which is every Sunday at 03:00.
+- `MAX_BACKUPS`: The number of backups to keep. When reaching the limit, the old backup will be discarded. No limit by default.
+- `INIT_BACKUP`: If set, create a backup when the container starts.
+- `INIT_RESTORE_LATEST`: Ff set, restores latest backup.
+
+If you want to make this image the perfect companion of your MySQL container, use [docker-compose](https://docs.docker.com/compose/). You can add more services that will be able to connect to the MySQL image using the name `my_mariadb`, note that you only expose the port `3306` internally to the servers and not to the host:
+
+```yaml
+version: "2"
+services:
+  mariadb:
+    image: mariadb
+    container_name: my_mariadb
+    expose:
+      - 3306
+    volumes:
+      # If there is not scheme, restore the last created backup (if exists)
+      - ${VOLUME_PATH}/backup/latest.${DATABASE_NAME}.sql.gz:/docker-entrypoint-initdb.d/database.sql.gz
+    environment:
+      - MYSQL_ROOT_PASSWORD=${MARIADB_ROOT_PASSWORD}
+      - MYSQL_DATABASE=${DATABASE_NAME}
+      - MYSQL_USER=${WORDPRESS_DB_USER}
+      - MYSQL_PASSWORD=${WORDPRESS_DB_PASSWORD}
+    restart: unless-stopped
+
+  mysql-cron-backup:
+    image: fradelg/mysql-cron-backup
+    depends_on:
+      - my_mariadb
+    volumes:
+      - ${VOLUME_PATH}/backup:/backup
+    environment:
+      - MYSQL_HOST=my_mariadb
+      - MYSQL_USER=root
+      - MYSQL_PASS=${MARIADB_ROOT_PASSWORD}
+      - MAX_BACKUPS=15
+      - INIT_BACKUP=0
+      # Every day at 03:00
+      - CRON_TIME=* 3 * * *
+    restart: unless-stopped
+
+```
 
 ## Restore from a backup
 
 See the list of backups in your running docker container, just write in your favorite terminal:
 
-    docker container exec backup ls /backup
+```bash
+docker container exec backup ls /backup
+```
 
 To restore a database from a certain backup, simply run:
 
-    docker container exec backup /restore.sh /backup/201708060500.my_db.sql.gz
+```bash
+docker container exec backup /restore.sh /backup/201708060500.my_db.sql.gz
+```

From 1bd0e144c97318ac697269303511d9f3f4bceb51 Mon Sep 17 00:00:00 2001
From: Manuel <mmartinortiz@gmail.com>
Date: Thu, 8 Nov 2018 14:34:29 +0100
Subject: [PATCH 018/138] Ignore error if file does not exist

---
 backup.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/backup.sh b/backup.sh
index 2d7fcdd..d331f58 100755
--- a/backup.sh
+++ b/backup.sh
@@ -15,7 +15,7 @@ do
     if mysqldump -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" --databases "$db" $MYSQLDUMP_OPTS > "$FILENAME"
     then
       gzip -f "$FILENAME"
-      rm "$LATEST"
+      rm "$LATEST" 2> /dev/null
       ln -s "$FILENAME" "$LATEST"
     else
       rm -rf "$FILENAME"

From fe1028a2059a7ffdfb8b63877ab98a3329e1ac2c Mon Sep 17 00:00:00 2001
From: Manuel <mmartinortiz@gmail.com>
Date: Thu, 8 Nov 2018 14:46:39 +0100
Subject: [PATCH 019/138] Using dockerize as entry point

---
 Dockerfile | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/Dockerfile b/Dockerfile
index 678e58e..a631b70 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -3,13 +3,18 @@ LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 COPY ["run.sh", "backup.sh", "restore.sh", "/"]
 
-RUN apk add --update bash mysql-client gzip && rm -rf /var/cache/apk/* && mkdir /backup &&\
+RUN apk add --update bash mysql-client gzip openssl && rm -rf /var/cache/apk/* && mkdir /backup &&\
   chmod u+x /backup.sh /restore.sh
 
+ENV DOCKERIZE_VERSION v0.6.1
+RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
+    && tar -C /usr/local/bin -xzvf dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
+    && rm dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz
+
 ENV CRON_TIME="0 3 * * sun" \
     MYSQL_HOST="mysql" \
     MYSQL_PORT="3306"
 
 VOLUME ["/backup"]
 
-CMD ["/run.sh"]
+CMD dockerize -wait tcp://${MYSQL_HOST}:3306 /run.sh

From d5eca7afc538a0eb522d6ab09c450a9f523b3e47 Mon Sep 17 00:00:00 2001
From: Manuel <mmartinortiz@gmail.com>
Date: Fri, 9 Nov 2018 15:55:53 +0100
Subject: [PATCH 020/138] Global MySQL port and timeout variable

---
 Dockerfile | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/Dockerfile b/Dockerfile
index a631b70..2e141e2 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -13,8 +13,9 @@ RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSI
 
 ENV CRON_TIME="0 3 * * sun" \
     MYSQL_HOST="mysql" \
-    MYSQL_PORT="3306"
+    MYSQL_PORT="3306" \
+    TIMEOUT="10s"
 
 VOLUME ["/backup"]
 
-CMD dockerize -wait tcp://${MYSQL_HOST}:3306 /run.sh
+CMD dockerize -wait tcp://${MYSQL_HOST}:${MYSQL_PORT} -timeout ${TIMEOUT} /run.sh

From a4ed62c9ccf37a13f1c566b711a37a7a0c511383 Mon Sep 17 00:00:00 2001
From: Manuel <mmartinortiz@gmail.com>
Date: Fri, 9 Nov 2018 16:09:18 +0100
Subject: [PATCH 021/138] Timeout documentation

---
 README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/README.md b/README.md
index f95276f..1903bae 100644
--- a/README.md
+++ b/README.md
@@ -27,6 +27,7 @@ docker container run -d \
 - `MAX_BACKUPS`: The number of backups to keep. When reaching the limit, the old backup will be discarded. No limit by default.
 - `INIT_BACKUP`: If set, create a backup when the container starts.
 - `INIT_RESTORE_LATEST`: Ff set, restores latest backup.
+- `TIMEOUT`: Wait a given number of seconds for the database to be ready and make the first backup, `10s` by default. After that time, the initial attempt for backup gives up and only the Cron job will try to make a backup.
 
 If you want to make this image the perfect companion of your MySQL container, use [docker-compose](https://docs.docker.com/compose/). You can add more services that will be able to connect to the MySQL image using the name `my_mariadb`, note that you only expose the port `3306` internally to the servers and not to the host:
 

From 7e99a5df2a23e9ea12c7420398886df6e2c03336 Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Fri, 9 Nov 2018 19:07:23 +0100
Subject: [PATCH 022/138] fix double quote

---
 backup.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/backup.sh b/backup.sh
index d331f58..4dc4f20 100755
--- a/backup.sh
+++ b/backup.sh
@@ -12,7 +12,7 @@ do
     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"
+    if mysqldump -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" --databases "$db" "$MYSQLDUMP_OPTS" > "$FILENAME"
     then
       gzip -f "$FILENAME"
       rm "$LATEST" 2> /dev/null

From 0ca0ac8f6860121708f3ae4f9be55c33acc24cb4 Mon Sep 17 00:00:00 2001
From: Manuel <mmartinortiz@gmail.com>
Date: Mon, 12 Nov 2018 21:12:12 +0100
Subject: [PATCH 023/138] Fix symlink creation

---
 backup.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/backup.sh b/backup.sh
index 4dc4f20..49b8d74 100755
--- a/backup.sh
+++ b/backup.sh
@@ -16,7 +16,7 @@ do
     then
       gzip -f "$FILENAME"
       rm "$LATEST" 2> /dev/null
-      ln -s "$FILENAME" "$LATEST"
+      cd backup && ln -s $(basename "$FILENAME".gz) $(basename "$LATEST") && cd ..
     else
       rm -rf "$FILENAME"
     fi

From 2b8cb54d0548bd9760e7b006ff9c5229a3cbab33 Mon Sep 17 00:00:00 2001
From: Manuel <mmartinortiz@gmail.com>
Date: Mon, 12 Nov 2018 21:12:53 +0100
Subject: [PATCH 024/138] Increased verbosity

---
 backup.sh | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/backup.sh b/backup.sh
index 49b8d74..4d79eff 100755
--- a/backup.sh
+++ b/backup.sh
@@ -3,18 +3,19 @@
 [ -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"
+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)}}
 for db in $databases
 do
   if [[ "$db" != "information_schema" ]] && [[ "$db" != "performance_schema" ]] && [[ "$db" != "mysql" ]] && [[ "$db" != _* ]]
   then
-    echo "Dumping database: $db"
+    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"
+    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 ..
     else
@@ -25,12 +26,13 @@ done
 
 if [ -n "$MAX_BACKUPS" ]
 then
+  echo "=> Max number of backups ("$MAX_BACKUPS") reached. Deleting oldest backups"
   while [ "$(find /backup -maxdepth 1 -name "*.sql.gz" -type f | wc -l)" -gt "$MAX_BACKUPS" ]
   do
     TARGET=$(find /backup -maxdepth 1 -name "*.sql.gz" -type f | sort | head -n 1)
-    echo "Backup $TARGET is deleted"
     rm -rf "$TARGET"
+    echo "==> Backup $TARGET has been deleted"
   done
 fi
 
-echo "=> Backup done"
+echo "=> Backup process finished at echo $(date "+%Y-%m-%d %H:%M:%S")"

From abba83c99b66f8c572932c0abf9be05c50da9459 Mon Sep 17 00:00:00 2001
From: Manuel <mmartinortiz@gmail.com>
Date: Mon, 26 Nov 2018 21:09:16 +0100
Subject: [PATCH 025/138] Creating symlink from absolute path

---
 backup.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/backup.sh b/backup.sh
index 4d79eff..b5be2ba 100755
--- a/backup.sh
+++ b/backup.sh
@@ -17,7 +17,7 @@ do
       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 ..
+      cd /backup && ln -s $(basename "$FILENAME".gz) $(basename "$LATEST") && cd -
     else
       rm -rf "$FILENAME"
     fi

From 0ffb2c0a1d15d70d771b12a76bb7633ccfe5a629 Mon Sep 17 00:00:00 2001
From: Mon555 <mon55555@gmail.com>
Date: Wed, 23 Jan 2019 10:14:47 +0700
Subject: [PATCH 026/138] fix typo in README.md

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 1903bae..3113c31 100644
--- a/README.md
+++ b/README.md
@@ -26,7 +26,7 @@ docker container run -d \
 - `CRON_TIME`: The interval of cron job to run mysqldump. `0 3 * * sun` by default, which is every Sunday at 03:00.
 - `MAX_BACKUPS`: The number of backups to keep. When reaching the limit, the old backup will be discarded. No limit by default.
 - `INIT_BACKUP`: If set, create a backup when the container starts.
-- `INIT_RESTORE_LATEST`: Ff set, restores latest backup.
+- `INIT_RESTORE_LATEST`: If set, restores latest backup.
 - `TIMEOUT`: Wait a given number of seconds for the database to be ready and make the first backup, `10s` by default. After that time, the initial attempt for backup gives up and only the Cron job will try to make a backup.
 
 If you want to make this image the perfect companion of your MySQL container, use [docker-compose](https://docs.docker.com/compose/). You can add more services that will be able to connect to the MySQL image using the name `my_mariadb`, note that you only expose the port `3306` internally to the servers and not to the host:

From 84c84b8a07ffed25498d87994452b43832def274 Mon Sep 17 00:00:00 2001
From: Daniel Cambray <DanielCambray@users.noreply.github.com>
Date: Tue, 29 Jan 2019 08:49:51 +0100
Subject: [PATCH 027/138] Error in the doc

The variable CRON_TIME is not set for every day at 03:00
---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 3113c31..1ce5e5a 100644
--- a/README.md
+++ b/README.md
@@ -62,7 +62,7 @@ services:
       - MAX_BACKUPS=15
       - INIT_BACKUP=0
       # Every day at 03:00
-      - CRON_TIME=* 3 * * *
+      - CRON_TIME=0 3 * * *
     restart: unless-stopped
 
 ```

From 7f01602f0fa59d694425375d0da1528e18194da0 Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Sun, 28 Jul 2019 15:58:55 +0200
Subject: [PATCH 028/138] fix issue #24 counting backups per DB

---
 Dockerfile |  7 +++----
 README.md  |  7 ++++---
 backup.sh  | 17 ++++++++++-------
 run.sh     |  2 +-
 4 files changed, 18 insertions(+), 15 deletions(-)

diff --git a/Dockerfile b/Dockerfile
index 2e141e2..c0ba4d9 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,10 +1,7 @@
 FROM alpine:3.7
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
-COPY ["run.sh", "backup.sh", "restore.sh", "/"]
-
-RUN apk add --update bash mysql-client gzip openssl && rm -rf /var/cache/apk/* && mkdir /backup &&\
-  chmod u+x /backup.sh /restore.sh
+RUN apk add --update bash mysql-client gzip openssl && rm -rf /var/cache/apk/*
 
 ENV DOCKERIZE_VERSION v0.6.1
 RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
@@ -16,6 +13,8 @@ ENV CRON_TIME="0 3 * * sun" \
     MYSQL_PORT="3306" \
     TIMEOUT="10s"
 
+COPY ["run.sh", "backup.sh", "restore.sh", "/"]
+RUN mkdir /backup && chmod u+x /backup.sh /restore.sh
 VOLUME ["/backup"]
 
 CMD dockerize -wait tcp://${MYSQL_HOST}:${MYSQL_PORT} -timeout ${TIMEOUT} /run.sh
diff --git a/README.md b/README.md
index 1ce5e5a..4ffcfed 100644
--- a/README.md
+++ b/README.md
@@ -40,19 +40,18 @@ services:
     expose:
       - 3306
     volumes:
+      - data:/var/lib/mysql
       # If there is not scheme, restore the last created backup (if exists)
       - ${VOLUME_PATH}/backup/latest.${DATABASE_NAME}.sql.gz:/docker-entrypoint-initdb.d/database.sql.gz
     environment:
       - MYSQL_ROOT_PASSWORD=${MARIADB_ROOT_PASSWORD}
       - MYSQL_DATABASE=${DATABASE_NAME}
-      - MYSQL_USER=${WORDPRESS_DB_USER}
-      - MYSQL_PASSWORD=${WORDPRESS_DB_PASSWORD}
     restart: unless-stopped
 
   mysql-cron-backup:
     image: fradelg/mysql-cron-backup
     depends_on:
-      - my_mariadb
+      - mariadb
     volumes:
       - ${VOLUME_PATH}/backup:/backup
     environment:
@@ -65,6 +64,8 @@ services:
       - CRON_TIME=0 3 * * *
     restart: unless-stopped
 
+volumes:
+  data:
 ```
 
 ## Restore from a backup
diff --git a/backup.sh b/backup.sh
index b5be2ba..30314da 100755
--- a/backup.sh
+++ b/backup.sh
@@ -4,8 +4,9 @@
 
 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)}}
-for db in $databases
+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
@@ -18,6 +19,7 @@ do
       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
@@ -26,13 +28,14 @@ done
 
 if [ -n "$MAX_BACKUPS" ]
 then
-  echo "=> Max number of backups ("$MAX_BACKUPS") reached. Deleting oldest backups"
-  while [ "$(find /backup -maxdepth 1 -name "*.sql.gz" -type f | wc -l)" -gt "$MAX_BACKUPS" ]
+  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)
-    rm -rf "$TARGET"
-    echo "==> Backup $TARGET has been deleted"
+    echo "==> Max number of backups ($MAX_BACKUPS) reached. Deleting ${TARGET} ..."
+    rm -rf "${TARGET}"
+    echo "==> Backup ${TARGET} deleted"
   done
 fi
 
-echo "=> Backup process finished at echo $(date "+%Y-%m-%d %H:%M:%S")"
+echo "=> Backup process finished at $(date "+%Y-%m-%d %H:%M:%S")"
diff --git a/run.sh b/run.sh
index f821cd6..999d3ef 100755
--- a/run.sh
+++ b/run.sh
@@ -2,7 +2,7 @@
 touch /mysql_backup.log
 tail -F /mysql_backup.log &
 
-if [ -n "${INIT_BACKUP}" ]; then
+if [ "${INIT_BACKUP}" -gt "0" ]; then
   echo "=> Create a backup on the startup"
   /backup.sh
 elif [ -n "${INIT_RESTORE_LATEST}" ]; then

From 592e61700543e2c2d48414b15bf3a62c84acf03b Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Sun, 28 Jul 2019 16:45:33 +0200
Subject: [PATCH 029/138] added docker-compose file for testing and bump base
 image

---
 Dockerfile          |  2 +-
 docker-compose.yaml | 33 +++++++++++++++++++++++++++++++++
 2 files changed, 34 insertions(+), 1 deletion(-)
 create mode 100644 docker-compose.yaml

diff --git a/Dockerfile b/Dockerfile
index c0ba4d9..02961b2 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM alpine:3.7
+FROM alpine:3.10
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update bash mysql-client gzip openssl && rm -rf /var/cache/apk/*
diff --git a/docker-compose.yaml b/docker-compose.yaml
new file mode 100644
index 0000000..d0b693f
--- /dev/null
+++ b/docker-compose.yaml
@@ -0,0 +1,33 @@
+version: "2"
+services:
+  mariadb:
+    image: mariadb:10
+    container_name: my_mariadb
+    expose:
+      - 3306
+    volumes:
+      - data:/var/lib/mysql
+      - ${VOLUME_PATH}/backup:/backup
+    environment:
+      - MYSQL_DATABASE=${DATABASE_NAME}
+      - MYSQL_ROOT_PASSWORD=${MARIADB_ROOT_PASSWORD}
+    restart: unless-stopped
+
+  backup:
+    build: .
+    image: fradelg/mysql-cron-backup
+    depends_on:
+      - mariadb
+    volumes:
+      - ${VOLUME_PATH}/backup:/backup
+    environment:
+      - MYSQL_HOST=my_mariadb
+      - MYSQL_USER=root
+      - MYSQL_PASS=${MARIADB_ROOT_PASSWORD}
+      - MAX_BACKUPS=1
+      - INIT_BACKUP=1
+      - CRON_TIME=0 0 * * *
+    restart: unless-stopped
+  
+volumes: 
+  data:
\ No newline at end of file

From e6673d546528e5634ba08a25834d7dbeb52318cb Mon Sep 17 00:00:00 2001
From: Jan Wagner <waja@cyconet.org>
Date: Tue, 7 Jan 2020 12:21:59 +0100
Subject: [PATCH 030/138] Update alpine baseimage to 3.11

---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index 02961b2..e96533e 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM alpine:3.10
+FROM alpine:3.11
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update bash mysql-client gzip openssl && rm -rf /var/cache/apk/*

From 0c29ac1adb5e6d1277374123b2e30a7f3f54c32e Mon Sep 17 00:00:00 2001
From: Ben D'Angelo <ben.dangelo@mosaic.com>
Date: Mon, 8 Jun 2020 23:06:39 +0800
Subject: [PATCH 031/138] Use args to select wanted arch and os

---
 Dockerfile | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/Dockerfile b/Dockerfile
index e96533e..287013c 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -3,10 +3,13 @@ LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update bash mysql-client gzip openssl && rm -rf /var/cache/apk/*
 
-ENV DOCKERIZE_VERSION v0.6.1
-RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
-    && tar -C /usr/local/bin -xzvf dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
-    && rm dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz
+ARG OS=alpine-linux
+ARG ARCH=amd64
+ARG DOCKERIZE_VERSION=v0.6.1
+
+RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-$OS-$ARCH-$DOCKERIZE_VERSION.tar.gz \
+    && tar -C /usr/local/bin -xzvf dockerize-$OS-$ARCH-$DOCKERIZE_VERSION.tar.gz \
+    && rm dockerize-$OS-$ARCH-$DOCKERIZE_VERSION.tar.gz
 
 ENV CRON_TIME="0 3 * * sun" \
     MYSQL_HOST="mysql" \

From 86c09693f01b9f6206b730977e0d2564a711c26f Mon Sep 17 00:00:00 2001
From: Jan Wagner <waja@cyconet.org>
Date: Mon, 6 Jul 2020 12:25:54 +0200
Subject: [PATCH 032/138] Update to Alpine 3.12 base image

---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index 287013c..60306ea 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM alpine:3.11
+FROM alpine:3.12
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update bash mysql-client gzip openssl && rm -rf /var/cache/apk/*

From 3db704557a11406d749afef37dd9e134b1bd5740 Mon Sep 17 00:00:00 2001
From: Richard Scorer <richard@scorer.org>
Date: Thu, 3 Sep 2020 14:30:21 +0100
Subject: [PATCH 033/138] Add ability to set gzip compression level

---
 README.md | 3 +++
 backup.sh | 3 ++-
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 4ffcfed..f44fe2c 100644
--- a/README.md
+++ b/README.md
@@ -28,6 +28,7 @@ docker container run -d \
 - `INIT_BACKUP`: If set, create a backup when the container starts.
 - `INIT_RESTORE_LATEST`: If set, restores latest backup.
 - `TIMEOUT`: Wait a given number of seconds for the database to be ready and make the first backup, `10s` by default. After that time, the initial attempt for backup gives up and only the Cron job will try to make a backup.
+- `GZIP_LEVEL`: Specify the level of gzip compression from 1 (quickest, least compressed) to 9 (slowest, most compressed), default is 6.
 
 If you want to make this image the perfect companion of your MySQL container, use [docker-compose](https://docs.docker.com/compose/). You can add more services that will be able to connect to the MySQL image using the name `my_mariadb`, note that you only expose the port `3306` internally to the servers and not to the host:
 
@@ -62,6 +63,8 @@ services:
       - INIT_BACKUP=0
       # Every day at 03:00
       - CRON_TIME=0 3 * * *
+      # Make it small
+      - GZIP_LEVEL=9
     restart: unless-stopped
 
 volumes:
diff --git a/backup.sh b/backup.sh
index 30314da..2a01db6 100755
--- a/backup.sh
+++ b/backup.sh
@@ -1,6 +1,7 @@
 #!/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; }
+[ -z "${GZIP_LEVEL}" ] && { GZIP_LEVEL=6; }
 
 DATE=$(date +%Y%m%d%H%M)
 echo "=> Backup started at $(date "+%Y-%m-%d %H:%M:%S")"
@@ -15,7 +16,7 @@ do
     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"
+      gzip "-$GZIP_LEVEL" -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 -

From d163a454d7f386aeb295afddfcc5fc7a575f9f30 Mon Sep 17 00:00:00 2001
From: Andreas Treubert <berti92@users.noreply.github.com>
Date: Mon, 14 Sep 2020 15:42:46 +0200
Subject: [PATCH 034/138] Update backup.sh

---
 backup.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/backup.sh b/backup.sh
index 2a01db6..d4cacb3 100755
--- a/backup.sh
+++ b/backup.sh
@@ -14,7 +14,7 @@ do
     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"
+    if mysqldump -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" $db $MYSQLDUMP_OPTS > "$FILENAME"
     then
       gzip "-$GZIP_LEVEL" -f "$FILENAME"
       echo "==> Creating symlink to latest backup: $(basename "$FILENAME".gz)"

From 8622152cebfcfd753eaa7f6616f311e15ed7a66d Mon Sep 17 00:00:00 2001
From: "javier.legido" <javier.legido@kedu.coop>
Date: Sat, 3 Oct 2020 11:29:37 +0200
Subject: [PATCH 035/138] Install alpine package 'tzdata' to allow passing
 timezone as environment variable: '-e TZ=foo/bar'

---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index 60306ea..b431222 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,7 +1,7 @@
 FROM alpine:3.12
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
-RUN apk add --update bash mysql-client gzip openssl && rm -rf /var/cache/apk/*
+RUN apk add --update tzdata bash mysql-client gzip openssl && rm -rf /var/cache/apk/*
 
 ARG OS=alpine-linux
 ARG ARCH=amd64

From 748381cdd26434bfae3c889c08d2a78548001299 Mon Sep 17 00:00:00 2001
From: "javier.legido" <javier.legido@kedu.coop>
Date: Sat, 3 Oct 2020 11:35:01 +0200
Subject: [PATCH 036/138] Clarify that environment variable 'CRON_TIME' uses
 UTC timezone

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index f44fe2c..7da931f 100644
--- a/README.md
+++ b/README.md
@@ -23,7 +23,7 @@ docker container run -d \
 - `MYSQL_PASS`: The password of your mysql database.
 - `MYSQL_DB`: The database name to dump. Default: `--all-databases`.
 - `MYSQLDUMP_OPTS`: Command line arguments to pass to mysqldump. Example: `--single-transaction`.
-- `CRON_TIME`: The interval of cron job to run mysqldump. `0 3 * * sun` by default, which is every Sunday at 03:00.
+- `CRON_TIME`: The interval of cron job to run mysqldump. `0 3 * * sun` by default, which is every Sunday at 03:00. It uses UTC timezone.
 - `MAX_BACKUPS`: The number of backups to keep. When reaching the limit, the old backup will be discarded. No limit by default.
 - `INIT_BACKUP`: If set, create a backup when the container starts.
 - `INIT_RESTORE_LATEST`: If set, restores latest backup.

From 07ec160d535daeeff359006d0359ab6ebd58a0af Mon Sep 17 00:00:00 2001
From: Andreas Treubert <berti92@users.noreply.github.com>
Date: Thu, 26 Nov 2020 16:26:35 +0100
Subject: [PATCH 037/138] Update README.md

---
 README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/README.md b/README.md
index f44fe2c..ad4f644 100644
--- a/README.md
+++ b/README.md
@@ -29,6 +29,7 @@ docker container run -d \
 - `INIT_RESTORE_LATEST`: If set, restores latest backup.
 - `TIMEOUT`: Wait a given number of seconds for the database to be ready and make the first backup, `10s` by default. After that time, the initial attempt for backup gives up and only the Cron job will try to make a backup.
 - `GZIP_LEVEL`: Specify the level of gzip compression from 1 (quickest, least compressed) to 9 (slowest, most compressed), default is 6.
+- `TZ`: Specify TIMEZONE in Container. E.g. "Europe/Berlin". Default ist UTC.
 
 If you want to make this image the perfect companion of your MySQL container, use [docker-compose](https://docs.docker.com/compose/). You can add more services that will be able to connect to the MySQL image using the name `my_mariadb`, note that you only expose the port `3306` internally to the servers and not to the host:
 

From 26a7d8ebb04b3af55ca797ecc45e2cd26cb033c1 Mon Sep 17 00:00:00 2001
From: Torsten Harenberg <harenberg@gmail.com>
Date: Thu, 7 Jan 2021 15:32:36 +0100
Subject: [PATCH 038/138] Add mariadb-connector-c package to support newer
 MySQL versions

The container does not run with newer (5.8+?) versions of MySQL as the
library to encrypt the password comes in a separate package.

Adding this package to the list of installed packages.
---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index b431222..4d7369c 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,7 +1,7 @@
 FROM alpine:3.12
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
-RUN apk add --update tzdata bash mysql-client gzip openssl && rm -rf /var/cache/apk/*
+RUN apk add --update tzdata bash mysql-client gzip openssl mariadb-connector-c && rm -rf /var/cache/apk/*
 
 ARG OS=alpine-linux
 ARG ARCH=amd64

From 15e8ee7e0f284697a87f073b0b9be297a6e2b202 Mon Sep 17 00:00:00 2001
From: Andreas Treubert <berti92@users.noreply.github.com>
Date: Sat, 9 Jan 2021 15:31:56 +0100
Subject: [PATCH 039/138] Update README.md

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index ad4f644..ec09470 100644
--- a/README.md
+++ b/README.md
@@ -29,7 +29,7 @@ docker container run -d \
 - `INIT_RESTORE_LATEST`: If set, restores latest backup.
 - `TIMEOUT`: Wait a given number of seconds for the database to be ready and make the first backup, `10s` by default. After that time, the initial attempt for backup gives up and only the Cron job will try to make a backup.
 - `GZIP_LEVEL`: Specify the level of gzip compression from 1 (quickest, least compressed) to 9 (slowest, most compressed), default is 6.
-- `TZ`: Specify TIMEZONE in Container. E.g. "Europe/Berlin". Default ist UTC.
+- `TZ`: Specify TIMEZONE in Container. E.g. "Europe/Berlin". Default is UTC.
 
 If you want to make this image the perfect companion of your MySQL container, use [docker-compose](https://docs.docker.com/compose/). You can add more services that will be able to connect to the MySQL image using the name `my_mariadb`, note that you only expose the port `3306` internally to the servers and not to the host:
 

From 37c242b29216a15a67132f38346ecff832066ca3 Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Sat, 6 Mar 2021 12:31:31 +0100
Subject: [PATCH 040/138] add github action for multiarch docker build

---
 .github/workflows/image.yml | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)
 create mode 100644 .github/workflows/image.yml

diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml
new file mode 100644
index 0000000..09f2c09
--- /dev/null
+++ b/.github/workflows/image.yml
@@ -0,0 +1,30 @@
+name: build docker image
+
+on:
+  push:
+    branches:
+      - "!*"
+    tags:
+      - "v*"
+
+jobs:
+  build:
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout the code
+        uses: actions/checkout@v2
+      - name: Install buildx
+        id: buildx
+        uses: crazy-max/ghaction-docker-buildx@v1
+        with:
+          version: latest
+      - name: Get latest release version number
+        id: get_version
+        uses: battila7/get-version-action@v2
+      - name: Login to Docker Hub
+        run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
+      - name: Build multiarch image
+        run: |
+          docker buildx build --push \
+            --tag fradelg/mysql-cron-backup:{{ steps.get_version.outputs.version-without-v }} \
+            --platform linux/amd64,linux/arm/v7,linux/arm64 .
\ No newline at end of file

From 057b0e823e0c94d194e3a6c221fb3c72db30a5f2 Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Sat, 6 Mar 2021 12:42:35 +0100
Subject: [PATCH 041/138] fix issues in build action

---
 .github/workflows/image.yml | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml
index 09f2c09..800a096 100644
--- a/.github/workflows/image.yml
+++ b/.github/workflows/image.yml
@@ -3,7 +3,7 @@ name: build docker image
 on:
   push:
     branches:
-      - "!*"
+      - "**"
     tags:
       - "v*"
 
@@ -19,12 +19,12 @@ jobs:
         with:
           version: latest
       - name: Get latest release version number
-        id: get_version
-        uses: battila7/get-version-action@v2
+        id: docker-tag
+        uses: yuya-takeyama/docker-tag-from-github-ref-action@v1
       - name: Login to Docker Hub
         run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
       - name: Build multiarch image
         run: |
           docker buildx build --push \
-            --tag fradelg/mysql-cron-backup:{{ steps.get_version.outputs.version-without-v }} \
+            --tag fradelg/mysql-cron-backup:${{ steps.docker-tag.outputs.tag }} \
             --platform linux/amd64,linux/arm/v7,linux/arm64 .
\ No newline at end of file

From 7c8bb006227155fe9a13d865a03568d5a67420a1 Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Sat, 6 Mar 2021 12:53:45 +0100
Subject: [PATCH 042/138] add test to github action

---
 .github/workflows/image.yml | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml
index 800a096..efc5c8c 100644
--- a/.github/workflows/image.yml
+++ b/.github/workflows/image.yml
@@ -1,6 +1,7 @@
 name: build docker image
 
 on:
+  workflow_dispatch:
   push:
     branches:
       - "**"
@@ -13,6 +14,8 @@ jobs:
     steps:
       - name: Checkout the code
         uses: actions/checkout@v2
+      - name: Test
+        run: sudo apt-get -qq update && sudo apt-get install -y devscripts shellcheck && make test
       - name: Install buildx
         id: buildx
         uses: crazy-max/ghaction-docker-buildx@v1

From 7e748dd82fea1bbf33351aeaca3f05ae4639899d Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Sat, 6 Mar 2021 13:03:08 +0100
Subject: [PATCH 043/138] use the official docker buildx action

---
 .github/workflows/image.yml | 11 ++++++-----
 backup.sh                   |  2 +-
 2 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml
index efc5c8c..5143bcb 100644
--- a/.github/workflows/image.yml
+++ b/.github/workflows/image.yml
@@ -16,11 +16,12 @@ jobs:
         uses: actions/checkout@v2
       - name: Test
         run: sudo apt-get -qq update && sudo apt-get install -y devscripts shellcheck && make test
-      - name: Install buildx
-        id: buildx
-        uses: crazy-max/ghaction-docker-buildx@v1
-        with:
-          version: latest
+      # https://github.com/docker/setup-qemu-action
+      - name: Set up QEMU
+        uses: docker/setup-qemu-action@v1
+      # https://github.com/docker/setup-buildx-action
+      - name: Set up Docker Buildx
+        uses: docker/setup-buildx-action@v1
       - name: Get latest release version number
         id: docker-tag
         uses: yuya-takeyama/docker-tag-from-github-ref-action@v1
diff --git a/backup.sh b/backup.sh
index d4cacb3..793c27e 100755
--- a/backup.sh
+++ b/backup.sh
@@ -19,7 +19,7 @@ do
       gzip "-$GZIP_LEVEL" -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 -
+      cd /backup || exit && ln -s $(basename "$FILENAME".gz) $(basename "$LATEST") && cd -
       DB_COUNTER=$(( DB_COUNTER + 1 ))
     else
       rm -rf "$FILENAME"

From 150f905567d32f74b8e74fb6697229926ea6644d Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Sat, 6 Mar 2021 13:28:03 +0100
Subject: [PATCH 044/138] remove travis and fix ubuntu version

---
 .github/workflows/image.yml | 11 ++++++++---
 .travis.yml                 | 10 ----------
 2 files changed, 8 insertions(+), 13 deletions(-)
 delete mode 100644 .travis.yml

diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml
index 5143bcb..64833a7 100644
--- a/.github/workflows/image.yml
+++ b/.github/workflows/image.yml
@@ -9,13 +9,18 @@ on:
       - "v*"
 
 jobs:
-  build:
-    runs-on: ubuntu-latest
+  test:
+    runs-on: ubuntu-20.04
     steps:
       - name: Checkout the code
         uses: actions/checkout@v2
-      - name: Test
+      - name: Test Bash scripts
         run: sudo apt-get -qq update && sudo apt-get install -y devscripts shellcheck && make test
+  build:
+    runs-on: ubuntu-20.04
+    steps:
+      - name: Checkout the code
+        uses: actions/checkout@v2
       # https://github.com/docker/setup-qemu-action
       - name: Set up QEMU
         uses: docker/setup-qemu-action@v1
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 120a65f..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-sudo: required
-dist: trusty
-language: bash
-
-before_script:
-  - sudo apt-get -qq update
-  - sudo apt-get install -y devscripts shellcheck
-
-script:
-  - make test

From 2405077482f6e7d8ff7cebd5cbf3a184b598b641 Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Sun, 7 Mar 2021 12:57:19 +0100
Subject: [PATCH 045/138] build dockerize and fix restore.sh db name for issue
 #38

---
 Dockerfile | 20 +++++++++++++-------
 README.md  | 21 ++++++++++++++++-----
 restore.sh |  3 ++-
 3 files changed, 31 insertions(+), 13 deletions(-)

diff --git a/Dockerfile b/Dockerfile
index 4d7369c..1d0f4ae 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,15 +1,21 @@
+FROM golang:1.15.8-alpine3.12 AS binary
+RUN apk -U add openssl git
+
+ARG DOCKERIZE_VERSION=v0.6.1
+WORKDIR /go/src/github.com/jwilder
+RUN git clone https://github.com/jwilder/dockerize.git && cd dockerize && git checkout ${DOCKERIZE_VERSION}
+
+WORKDIR /go/src/github.com/jwilder/dockerize
+RUN go get github.com/robfig/glock
+RUN glock sync -n < GLOCKFILE
+RUN go install
+
 FROM alpine:3.12
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update tzdata bash mysql-client gzip openssl mariadb-connector-c && rm -rf /var/cache/apk/*
 
-ARG OS=alpine-linux
-ARG ARCH=amd64
-ARG DOCKERIZE_VERSION=v0.6.1
-
-RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-$OS-$ARCH-$DOCKERIZE_VERSION.tar.gz \
-    && tar -C /usr/local/bin -xzvf dockerize-$OS-$ARCH-$DOCKERIZE_VERSION.tar.gz \
-    && rm dockerize-$OS-$ARCH-$DOCKERIZE_VERSION.tar.gz
+COPY --from=binary /go/bin/dockerize /usr/local/bin
 
 ENV CRON_TIME="0 3 * * sun" \
     MYSQL_HOST="mysql" \
diff --git a/README.md b/README.md
index ed8cb86..cdecc77 100644
--- a/README.md
+++ b/README.md
@@ -21,7 +21,7 @@ docker container run -d \
 - `MYSQL_PORT`: The port number of your mysql database.
 - `MYSQL_USER`: The username of your mysql database.
 - `MYSQL_PASS`: The password of your mysql database.
-- `MYSQL_DB`: The database name to dump. Default: `--all-databases`.
+- `MYSQL_DATABASE`: The database name to dump. Default: `--all-databases`.
 - `MYSQLDUMP_OPTS`: Command line arguments to pass to mysqldump. Example: `--single-transaction`.
 - `CRON_TIME`: The interval of cron job to run mysqldump. `0 3 * * sun` by default, which is every Sunday at 03:00. It uses UTC timezone.
 - `MAX_BACKUPS`: The number of backups to keep. When reaching the limit, the old backup will be discarded. No limit by default.
@@ -77,11 +77,22 @@ volumes:
 See the list of backups in your running docker container, just write in your favorite terminal:
 
 ```bash
-docker container exec backup ls /backup
+docker container exec <your_mysql_backuo_container_name> ls /backup
 ```
 
-To restore a database from a certain backup, simply run:
+To restore a database from a certain backup you have to specify the database name in the variable MYSQL_DATABASE:
 
-```bash
-docker container exec backup /restore.sh /backup/201708060500.my_db.sql.gz
+```YAML
+mysql-cron-backup:
+    image: fradelg/mysql-cron-backup
+    command: "/restore.sh /backup/201708060500.${DATABASE_NAME}.sql.gz"
+    depends_on:
+      - mariadb
+    volumes:
+      - ${VOLUME_PATH}/backup:/backup
+    environment:
+      - MYSQL_HOST=my_mariadb
+      - MYSQL_USER=root
+      - MYSQL_PASS=${MARIADB_ROOT_PASSWORD}
+      - MYSQL_DATABASE=${DATABASE_NAME}
 ```
diff --git a/restore.sh b/restore.sh
index 20561f2..e2d8796 100755
--- a/restore.sh
+++ b/restore.sh
@@ -9,7 +9,8 @@ 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"
+DB_NAME=${MYSQL_DATABASE:-${MYSQL_DB}}
+if gunzip --stdout "$1" | mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" "$DB_NAME"
 then
     echo "=> Restore succeeded"
 else

From 4d2a75df199a0852c39ea6bcea45231e57ca95c6 Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Sun, 7 Mar 2021 13:05:22 +0100
Subject: [PATCH 046/138] build job depends on tests

---
 .github/workflows/image.yml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml
index 64833a7..1a6b3ef 100644
--- a/.github/workflows/image.yml
+++ b/.github/workflows/image.yml
@@ -18,6 +18,7 @@ jobs:
         run: sudo apt-get -qq update && sudo apt-get install -y devscripts shellcheck && make test
   build:
     runs-on: ubuntu-20.04
+    needs: test
     steps:
       - name: Checkout the code
         uses: actions/checkout@v2

From 4e5a9162f4343159b9a9f63a9df0fee5e31d3ca6 Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Tue, 16 Mar 2021 19:59:46 +0100
Subject: [PATCH 047/138] fix typo in tag filter for builds

---
 .github/workflows/image.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml
index 1a6b3ef..7a4203a 100644
--- a/.github/workflows/image.yml
+++ b/.github/workflows/image.yml
@@ -6,7 +6,7 @@ on:
     branches:
       - "**"
     tags:
-      - "v*"
+      - "**"
 
 jobs:
   test:

From 9501648ce9f373f769f830bc2d90eb9265c97107 Mon Sep 17 00:00:00 2001
From: Christian Hase <hasechris@users.noreply.github.com>
Date: Wed, 7 Apr 2021 19:19:42 +0200
Subject: [PATCH 048/138] Update backup.sh

added --single-transaction parameter to "halt" the mysql database while exporting
---
 backup.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/backup.sh b/backup.sh
index 793c27e..a7cc487 100755
--- a/backup.sh
+++ b/backup.sh
@@ -14,7 +14,7 @@ do
     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" $db $MYSQLDUMP_OPTS > "$FILENAME"
+    if mysqldump --single-transaction -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" $db $MYSQLDUMP_OPTS > "$FILENAME"
     then
       gzip "-$GZIP_LEVEL" -f "$FILENAME"
       echo "==> Creating symlink to latest backup: $(basename "$FILENAME".gz)"

From 1302281333472e54e04af5be6ffc495bd0e044d0 Mon Sep 17 00:00:00 2001
From: Stelage <stelage@protonmail.com>
Date: Tue, 4 May 2021 22:59:10 +0200
Subject: [PATCH 049/138] Allow restoring without specifying DATABASE_NAME

---
 README.md  | 15 +++++++++++++--
 restore.sh | 16 +++++++++++++---
 2 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/README.md b/README.md
index cdecc77..5cc37ca 100644
--- a/README.md
+++ b/README.md
@@ -74,13 +74,17 @@ volumes:
 
 ## Restore from a backup
 
+### List all available backups :
+
 See the list of backups in your running docker container, just write in your favorite terminal:
 
 ```bash
-docker container exec <your_mysql_backuo_container_name> ls /backup
+docker container exec <your_mysql_backup_container_name> ls /backup
 ```
 
-To restore a database from a certain backup you have to specify the database name in the variable MYSQL_DATABASE:
+### Restore using a compose file
+
+To restore a database from a certain backup you may have to specify the database name in the variable MYSQL_DATABASE:
 
 ```YAML
 mysql-cron-backup:
@@ -96,3 +100,10 @@ mysql-cron-backup:
       - MYSQL_PASS=${MARIADB_ROOT_PASSWORD}
       - MYSQL_DATABASE=${DATABASE_NAME}
 ```
+### Restore using a docker command
+
+```bash
+docker container exec <your_mysql_backup_container_name> /restore.sh backup/<your_sql_backup_gz_file>
+```
+
+if no database name is specified, `restore.sh` will try to find the database name from the backup file.
\ No newline at end of file
diff --git a/restore.sh b/restore.sh
index e2d8796..1cd478c 100755
--- a/restore.sh
+++ b/restore.sh
@@ -7,10 +7,20 @@ then
     echo "You must pass the path of the backup file to restore"
 fi
 
-echo "=> Restore database from $1"
-set -o pipefail
+SQL=$(gunzip -c "$1")
 DB_NAME=${MYSQL_DATABASE:-${MYSQL_DB}}
-if gunzip --stdout "$1" | mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" "$DB_NAME"
+if [ -z "${DB_NAME}"]
+then
+    DB_NAME=$(echo $SQL | grep -oE '(Database: (\w*))' | cut -d ' ' -f 2)
+fi
+[ -z "${DB_NAME}" ] && { echo "=> database name cannot be found" && exit 1; }
+
+
+echo "=> Restore database $DB_NAME from $1"
+set -o pipefail
+
+
+if echo $SQL | mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" "$DB_NAME"
 then
     echo "=> Restore succeeded"
 else

From 038d4faf7fc99dbfb8595969b938c9c31e7f7b6a Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Sat, 8 May 2021 21:58:48 +0200
Subject: [PATCH 050/138] allow to run crontab job with userid 1000

---
 Dockerfile | 17 +++++++++++++++--
 backup.sh  |  4 ++--
 run.sh     |  5 ++---
 3 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/Dockerfile b/Dockerfile
index 1d0f4ae..4165251 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -13,7 +13,15 @@ RUN go install
 FROM alpine:3.12
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
-RUN apk add --update tzdata bash mysql-client gzip openssl mariadb-connector-c && rm -rf /var/cache/apk/*
+RUN apk add --update \
+        tzdata \
+        bash \
+        mysql-client \
+        gzip \
+        openssl \
+        mariadb-connector-c \
+        busybox-suid && \
+    rm -rf /var/cache/apk/*
 
 COPY --from=binary /go/bin/dockerize /usr/local/bin
 
@@ -23,7 +31,12 @@ ENV CRON_TIME="0 3 * * sun" \
     TIMEOUT="10s"
 
 COPY ["run.sh", "backup.sh", "restore.sh", "/"]
-RUN mkdir /backup && chmod u+x /backup.sh /restore.sh
+RUN mkdir /backup && \ 
+    chmod 755 /run.sh /backup.sh /restore.sh && \
+    touch /mysql_backup.log && \
+    chmod 666 /mysql_backup.log && \
+    adduser -S -u 1000 -g 100 cronuser
+
 VOLUME ["/backup"]
 
 CMD dockerize -wait tcp://${MYSQL_HOST}:${MYSQL_PORT} -timeout ${TIMEOUT} /run.sh
diff --git a/backup.sh b/backup.sh
index 793c27e..1c1a628 100755
--- a/backup.sh
+++ b/backup.sh
@@ -14,12 +14,12 @@ do
     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" $db $MYSQLDUMP_OPTS > "$FILENAME"
+    if mysqldump -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" "$db" $MYSQLDUMP_OPTS > "$FILENAME"
     then
       gzip "-$GZIP_LEVEL" -f "$FILENAME"
       echo "==> Creating symlink to latest backup: $(basename "$FILENAME".gz)"
       rm "$LATEST" 2> /dev/null
-      cd /backup || exit && ln -s $(basename "$FILENAME".gz) $(basename "$LATEST") && cd -
+      cd /backup || exit && ln -s "$(basename "$FILENAME".gz)" "$(basename "$LATEST")" && cd - || exit
       DB_COUNTER=$(( DB_COUNTER + 1 ))
     else
       rm -rf "$FILENAME"
diff --git a/run.sh b/run.sh
index 999d3ef..7f9be97 100755
--- a/run.sh
+++ b/run.sh
@@ -1,5 +1,4 @@
 #!/bin/bash
-touch /mysql_backup.log
 tail -F /mysql_backup.log &
 
 if [ "${INIT_BACKUP}" -gt "0" ]; then
@@ -15,7 +14,7 @@ elif [ -n "${INIT_RESTORE_LATEST}" ]; then
 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 "${CRON_TIME} /backup.sh >> /mysql_backup.log 2>&1" > /tmp/crontab.conf
+crontab /tmp/crontab.conf
 echo "=> Running cron task manager"
 exec crond -f

From 89bb6f185efe66a7e72b7a4a76e291ae5b3f3555 Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Sun, 9 May 2021 11:28:53 +0200
Subject: [PATCH 051/138] log crond output, remove 1000 userid

---
 Dockerfile | 10 ++++++----
 backup.sh  |  2 +-
 run.sh     |  6 +++---
 3 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/Dockerfile b/Dockerfile
index 4165251..3e8b9e5 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -3,7 +3,9 @@ RUN apk -U add openssl git
 
 ARG DOCKERIZE_VERSION=v0.6.1
 WORKDIR /go/src/github.com/jwilder
-RUN git clone https://github.com/jwilder/dockerize.git && cd dockerize && git checkout ${DOCKERIZE_VERSION}
+RUN git clone https://github.com/jwilder/dockerize.git && \
+    cd dockerize && \
+    git checkout ${DOCKERIZE_VERSION}
 
 WORKDIR /go/src/github.com/jwilder/dockerize
 RUN go get github.com/robfig/glock
@@ -31,11 +33,11 @@ ENV CRON_TIME="0 3 * * sun" \
     TIMEOUT="10s"
 
 COPY ["run.sh", "backup.sh", "restore.sh", "/"]
-RUN mkdir /backup && \ 
+RUN mkdir /backup && \
+    chmod 777 /backup && \ 
     chmod 755 /run.sh /backup.sh /restore.sh && \
     touch /mysql_backup.log && \
-    chmod 666 /mysql_backup.log && \
-    adduser -S -u 1000 -g 100 cronuser
+    chmod 666 /mysql_backup.log
 
 VOLUME ["/backup"]
 
diff --git a/backup.sh b/backup.sh
index 2930517..8c5ad75 100755
--- a/backup.sh
+++ b/backup.sh
@@ -19,7 +19,7 @@ do
       gzip "-$GZIP_LEVEL" -f "$FILENAME"
       echo "==> Creating symlink to latest backup: $(basename "$FILENAME".gz)"
       rm "$LATEST" 2> /dev/null
-      cd /backup || exit && ln -s "$(basename "$FILENAME".gz)" "$(basename "$LATEST")" && cd - || exit
+      cd /backup || exit && ln -s "$(basename "$FILENAME".gz)" "$(basename "$LATEST")"
       DB_COUNTER=$(( DB_COUNTER + 1 ))
     else
       rm -rf "$FILENAME"
diff --git a/run.sh b/run.sh
index 7f9be97..95f8009 100755
--- a/run.sh
+++ b/run.sh
@@ -11,10 +11,10 @@ elif [ -n "${INIT_RESTORE_LATEST}" ]; then
       echo "waiting database container..."
       sleep 1
   done
-find /backup -maxdepth 1 -name '*.sql.gz' | tail -1 | xargs /restore.sh
+  find /backup -maxdepth 1 -name '*.sql.gz' | tail -1 | xargs /restore.sh
 fi
 
 echo "${CRON_TIME} /backup.sh >> /mysql_backup.log 2>&1" > /tmp/crontab.conf
 crontab /tmp/crontab.conf
-echo "=> Running cron task manager"
-exec crond -f
+echo "=> Running cron task manager in foreground"
+exec crond -f -l 8 -L /mysql_backup.log

From 7c8f51eac31529c74ee24c853dbd8db9b64d8110 Mon Sep 17 00:00:00 2001
From: Stelage <stelage@protonmail.com>
Date: Sun, 9 May 2021 17:57:18 +0200
Subject: [PATCH 052/138] Fix pipefail position

---
 restore.sh | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/restore.sh b/restore.sh
index 1cd478c..ab365f2 100755
--- a/restore.sh
+++ b/restore.sh
@@ -7,6 +7,8 @@ then
     echo "You must pass the path of the backup file to restore"
 fi
 
+set -o pipefail
+
 SQL=$(gunzip -c "$1")
 DB_NAME=${MYSQL_DATABASE:-${MYSQL_DB}}
 if [ -z "${DB_NAME}"]
@@ -15,10 +17,7 @@ then
 fi
 [ -z "${DB_NAME}" ] && { echo "=> database name cannot be found" && exit 1; }
 
-
 echo "=> Restore database $DB_NAME from $1"
-set -o pipefail
-
 
 if echo $SQL | mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" "$DB_NAME"
 then

From 41ea03511f5acc62ad0253f463ded9c10b6b86f3 Mon Sep 17 00:00:00 2001
From: Stelage <stelage@protonmail.com>
Date: Sun, 9 May 2021 17:58:46 +0200
Subject: [PATCH 053/138] Quotes on SQL var was missing.

---
 restore.sh | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/restore.sh b/restore.sh
index ab365f2..3ca9e92 100755
--- a/restore.sh
+++ b/restore.sh
@@ -13,13 +13,13 @@ SQL=$(gunzip -c "$1")
 DB_NAME=${MYSQL_DATABASE:-${MYSQL_DB}}
 if [ -z "${DB_NAME}"]
 then
-    DB_NAME=$(echo $SQL | grep -oE '(Database: (\w*))' | cut -d ' ' -f 2)
+    DB_NAME=$(echo "$SQL" | grep -oE '(Database: (\w*))' | cut -d ' ' -f 2)
 fi
 [ -z "${DB_NAME}" ] && { echo "=> database name cannot be found" && exit 1; }
 
 echo "=> Restore database $DB_NAME from $1"
 
-if echo $SQL | mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" "$DB_NAME"
+if echo "$SQL" | mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" "$DB_NAME"
 then
     echo "=> Restore succeeded"
 else

From 6c79828e8b0141f37a366680a689c7ea62beaafa Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Thu, 13 May 2021 20:24:13 +0200
Subject: [PATCH 054/138] fix README

---
 README.md | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/README.md b/README.md
index 5cc37ca..a09bec0 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,6 @@
-[![Build Status](https://travis-ci.org/fradelg/docker-mysql-cron-backup.svg?branch=master)](https://travis-ci.org/fradelg/docker-mysql-cron-backup)
-
 # mysql-cron-backup
 
-This docker image runs mysqldump to backup your databases periodically using cron task manager. Backups are placed in `/backup` so you can mount your backup docker volume in this path.
+Run mysqldump to backup your databases periodically using the cron task manager in the container. Your backups are saved in `/backup`. You can mount any directory of your host or a docker volumes in /backup. Othwerwise, a docker volume is created in the default location.
 
 ## Usage:
 
@@ -103,7 +101,7 @@ mysql-cron-backup:
 ### Restore using a docker command
 
 ```bash
-docker container exec <your_mysql_backup_container_name> /restore.sh backup/<your_sql_backup_gz_file>
+docker container exec <your_mysql_backup_container_name> /restore.sh /backup/<your_sql_backup_gz_file>
 ```
 
 if no database name is specified, `restore.sh` will try to find the database name from the backup file.
\ No newline at end of file

From 4fb031b08722abd9d76a700c4616a4d90eda3553 Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Thu, 13 May 2021 20:30:26 +0200
Subject: [PATCH 055/138] removed unused package

---
 Dockerfile | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/Dockerfile b/Dockerfile
index 3e8b9e5..bedf025 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -21,8 +21,7 @@ RUN apk add --update \
         mysql-client \
         gzip \
         openssl \
-        mariadb-connector-c \
-        busybox-suid && \
+        mariadb-connector-c && \
     rm -rf /var/cache/apk/*
 
 COPY --from=binary /go/bin/dockerize /usr/local/bin

From e91114710fc93767c13356fe432c8af9941f6ee3 Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Mon, 24 May 2021 20:11:30 +0200
Subject: [PATCH 056/138] relax regex in grep from Database

---
 restore.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/restore.sh b/restore.sh
index 3ca9e92..575624e 100755
--- a/restore.sh
+++ b/restore.sh
@@ -13,7 +13,7 @@ SQL=$(gunzip -c "$1")
 DB_NAME=${MYSQL_DATABASE:-${MYSQL_DB}}
 if [ -z "${DB_NAME}"]
 then
-    DB_NAME=$(echo "$SQL" | grep -oE '(Database: (\w*))' | cut -d ' ' -f 2)
+    DB_NAME=$(echo "$SQL" | grep -oE '(Database: (.+))' | cut -d ' ' -f 2)
 fi
 [ -z "${DB_NAME}" ] && { echo "=> database name cannot be found" && exit 1; }
 

From aa4ddc21d9f5bb0c931c3575d69f0d9a7c2e4c45 Mon Sep 17 00:00:00 2001
From: dlencer <46929718+dlencer@users.noreply.github.com>
Date: Thu, 21 Oct 2021 12:37:55 +0200
Subject: [PATCH 057/138] Fix unintended deletions of old dumps

Previously, if `mysql` or `mysqldump` failed and you were using the `MAX_BACKUPS`-option, all old dumps were deleted. Now only dumps of successfully detected databases are considered for deletion.
---
 backup.sh | 25 ++++++++++---------------
 1 file changed, 10 insertions(+), 15 deletions(-)

diff --git a/backup.sh b/backup.sh
index 8c5ad75..615d6a1 100755
--- a/backup.sh
+++ b/backup.sh
@@ -6,7 +6,6 @@
 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" != _* ]]
@@ -20,23 +19,19 @@ do
       echo "==> Creating symlink to latest backup: $(basename "$FILENAME".gz)"
       rm "$LATEST" 2> /dev/null
       cd /backup || exit && ln -s "$(basename "$FILENAME".gz)" "$(basename "$LATEST")"
-      DB_COUNTER=$(( DB_COUNTER + 1 ))
+      if [ -n "$MAX_BACKUPS" ]
+      then
+        while [ "$(find /backup -maxdepth 1 -name "*.$db.sql.gz" -type f | wc -l)" -gt "$MAX_BACKUPS" ]
+        do
+          TARGET=$(find /backup -maxdepth 1 -name "*.$db.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
     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")"

From db19ca11308cf9d4866daef4fbaeed3e95abe029 Mon Sep 17 00:00:00 2001
From: Allan Jacquet-Cretides <Jumanjii@users.noreply.github.com>
Date: Sun, 7 Nov 2021 23:26:56 +0100
Subject: [PATCH 058/138] Add missing space in if with square bracket

A missing space at the end of an if condition was generating a warning message.
/restore.sh: line 14: [: missing `]'

Adding it delete this error message
---
 restore.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/restore.sh b/restore.sh
index 575624e..131d6a5 100755
--- a/restore.sh
+++ b/restore.sh
@@ -11,7 +11,7 @@ set -o pipefail
 
 SQL=$(gunzip -c "$1")
 DB_NAME=${MYSQL_DATABASE:-${MYSQL_DB}}
-if [ -z "${DB_NAME}"]
+if [ -z "${DB_NAME}" ]
 then
     DB_NAME=$(echo "$SQL" | grep -oE '(Database: (.+))' | cut -d ' ' -f 2)
 fi

From f2cefb1f9fa4dbae7ee6dbc53782b9adee430977 Mon Sep 17 00:00:00 2001
From: Jan Wagner <waja@cyconet.org>
Date: Mon, 8 Nov 2021 20:56:01 +0100
Subject: [PATCH 059/138] Adding dependabot config

---
 .github/dependabot.yml | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)
 create mode 100644 .github/dependabot.yml

diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..a8dc5a4
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,19 @@
+version: 2
+updates:
+  - package-ecosystem: github-actions
+    directory: "/"
+    schedule:
+      interval: daily
+      time: "04:00"
+    pull-request-branch-name:
+      separator: "-"
+    open-pull-requests-limit: 10
+  - package-ecosystem: docker
+    directory: "/"
+    schedule:
+      interval: daily
+      time: "04:00"
+    target-branch: "master"
+    pull-request-branch-name:
+      separator: "-"
+    open-pull-requests-limit: 10

From 6f5e7b0eedc5b0165981e4d4f7adfafb53bc3b46 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 8 Nov 2021 22:09:42 +0000
Subject: [PATCH 060/138] Bump alpine from 3.12 to 3.14.2

Bumps alpine from 3.12 to 3.14.2.

---
updated-dependencies:
- dependency-name: alpine
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index bedf025..d0e980f 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,7 +12,7 @@ RUN go get github.com/robfig/glock
 RUN glock sync -n < GLOCKFILE
 RUN go install
 
-FROM alpine:3.12
+FROM alpine:3.14.2
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update \

From 566cbc7c67042c152e8fc03c3250c5f453c81a85 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 15 Nov 2021 04:27:07 +0000
Subject: [PATCH 061/138] Bump alpine from 3.14.2 to 3.14.3

Bumps alpine from 3.14.2 to 3.14.3.

---
updated-dependencies:
- dependency-name: alpine
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index d0e980f..9bdcf0d 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,7 +12,7 @@ RUN go get github.com/robfig/glock
 RUN glock sync -n < GLOCKFILE
 RUN go install
 
-FROM alpine:3.14.2
+FROM alpine:3.14.3
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update \

From f2ac763df9f791b50fd157e126f1e38202787668 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 25 Nov 2021 04:27:29 +0000
Subject: [PATCH 062/138] Bump alpine from 3.14.3 to 3.15.0

Bumps alpine from 3.14.3 to 3.15.0.

---
updated-dependencies:
- dependency-name: alpine
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index 9bdcf0d..d19d572 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,7 +12,7 @@ RUN go get github.com/robfig/glock
 RUN glock sync -n < GLOCKFILE
 RUN go install
 
-FROM alpine:3.14.3
+FROM alpine:3.15.0
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update \

From 9c7c4d74e3bf54e57f3248edc47abd30c1d02ace Mon Sep 17 00:00:00 2001
From: skimpax <3287732+skimpax@users.noreply.github.com>
Date: Thu, 30 Dec 2021 18:37:52 +0100
Subject: [PATCH 063/138] Specify password in a file via MYSQL_PASS_FILE

---
 backup.sh  | 4 ++++
 restore.sh | 4 ++++
 2 files changed, 8 insertions(+)

diff --git a/backup.sh b/backup.sh
index 615d6a1..ebb4cb7 100755
--- a/backup.sh
+++ b/backup.sh
@@ -1,5 +1,9 @@
 #!/bin/bash
+
 [ -z "${MYSQL_USER}" ] && { echo "=> MYSQL_USER cannot be empty" && exit 1; }
+# If provided, take password from file
+[ -z "${MYSQL_PASS_FILE}" ] || { MYSQL_PASS=$(head -1 "${MYSQL_PASS_FILE}"); }
+# Alternatively, take it from env var
 [ -z "${MYSQL_PASS:=$MYSQL_PASSWORD}" ] && { echo "=> MYSQL_PASS cannot be empty" && exit 1; }
 [ -z "${GZIP_LEVEL}" ] && { GZIP_LEVEL=6; }
 
diff --git a/restore.sh b/restore.sh
index 131d6a5..07ecbae 100755
--- a/restore.sh
+++ b/restore.sh
@@ -1,5 +1,9 @@
 #!/bin/bash
+
 [ -z "${MYSQL_USER}" ] && { echo "=> MYSQL_USER cannot be empty" && exit 1; }
+# If provided, take password from file
+[ -z "${MYSQL_PASS_FILE}" ] || { MYSQL_PASS=$(head -1 "${MYSQL_PASS_FILE}"); }
+# Alternatively, take it from env var
 [ -z "${MYSQL_PASS}" ] && { echo "=> MYSQL_PASS cannot be empty" && exit 1; }
 
 if [ "$#" -ne 1 ]

From 9f81b63bcd3df0e27aab5a93dc6651840acafb47 Mon Sep 17 00:00:00 2001
From: skimpax <3287732+skimpax@users.noreply.github.com>
Date: Thu, 30 Dec 2021 18:38:06 +0100
Subject: [PATCH 064/138] Ignore 'sys' table when backuping

---
 backup.sh | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/backup.sh b/backup.sh
index ebb4cb7..6b75964 100755
--- a/backup.sh
+++ b/backup.sh
@@ -12,7 +12,11 @@ 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)}}
 for db in ${DATABASES}
 do
-  if [[ "$db" != "information_schema" ]] && [[ "$db" != "performance_schema" ]] && [[ "$db" != "mysql" ]] && [[ "$db" != _* ]]
+  if  [[ "$db" != "information_schema" ]] \
+      && [[ "$db" != "performance_schema" ]] \
+      && [[ "$db" != "mysql" ]] \
+      && [[ "$db" != "sys" ]] \
+      && [[ "$db" != _* ]]
   then
     echo "==> Dumping database: $db"
     FILENAME=/backup/$DATE.$db.sql

From a365376ebe7d6c83e21cc5852b65979ec239dcd0 Mon Sep 17 00:00:00 2001
From: skimpax <3287732+skimpax@users.noreply.github.com>
Date: Thu, 30 Dec 2021 18:38:31 +0100
Subject: [PATCH 065/138] Add double quotes

---
 backup.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/backup.sh b/backup.sh
index 6b75964..71ba385 100755
--- a/backup.sh
+++ b/backup.sh
@@ -21,7 +21,7 @@ do
     echo "==> Dumping database: $db"
     FILENAME=/backup/$DATE.$db.sql
     LATEST=/backup/latest.$db.sql.gz
-    if mysqldump --single-transaction -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" "$db" $MYSQLDUMP_OPTS > "$FILENAME"
+    if mysqldump --single-transaction -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" "$db" "$MYSQLDUMP_OPTS" > "$FILENAME"
     then
       gzip "-$GZIP_LEVEL" -f "$FILENAME"
       echo "==> Creating symlink to latest backup: $(basename "$FILENAME".gz)"

From 203280de70cc3a539800f0775cd9a89c1bdbba5b Mon Sep 17 00:00:00 2001
From: skimpax <3287732+skimpax@users.noreply.github.com>
Date: Thu, 30 Dec 2021 18:39:02 +0100
Subject: [PATCH 066/138] Update readme for docker secrets example

---
 README.md | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 58 insertions(+)

diff --git a/README.md b/README.md
index a09bec0..e2cd2e8 100644
--- a/README.md
+++ b/README.md
@@ -19,6 +19,7 @@ docker container run -d \
 - `MYSQL_PORT`: The port number of your mysql database.
 - `MYSQL_USER`: The username of your mysql database.
 - `MYSQL_PASS`: The password of your mysql database.
+- `MYSQL_PASS_FILE`: The file in container where to find the password of your mysql database (cf. docker secrets). You should use either MYSQL_PASS_FILE or MYSQL_PASS (see examples below).
 - `MYSQL_DATABASE`: The database name to dump. Default: `--all-databases`.
 - `MYSQLDUMP_OPTS`: Command line arguments to pass to mysqldump. Example: `--single-transaction`.
 - `CRON_TIME`: The interval of cron job to run mysqldump. `0 3 * * sun` by default, which is every Sunday at 03:00. It uses UTC timezone.
@@ -31,6 +32,8 @@ docker container run -d \
 
 If you want to make this image the perfect companion of your MySQL container, use [docker-compose](https://docs.docker.com/compose/). You can add more services that will be able to connect to the MySQL image using the name `my_mariadb`, note that you only expose the port `3306` internally to the servers and not to the host:
 
+### Docker-compose with MYSQL_PASS env var:
+
 ```yaml
 version: "2"
 services:
@@ -70,6 +73,61 @@ volumes:
   data:
 ```
 
+### Docker-compose using docker secrets:
+
+The database root password passed to docker container by using [docker secrets](https://docs.docker.com/engine/swarm/).
+
+In example below, docker is in classic 'docker engine mode' (iow. not swarm mode) and secret source is a local file on host filesystem.
+
+Alternatively, secret can be stored in docker secrets engine (iow. not in host filesystem).
+
+```yaml
+version: "3.7"
+
+secrets:
+  mysql_root_password:
+    # Place your secret file somewhere on your host filesystem, with your password inside
+    file: ./secrets/mysql_root_password
+
+services:
+  mariadb:
+    image: mariadb:10
+    container_name: my_mariadb
+    expose:
+      - 3306
+    volumes:
+      - data:/var/lib/mysql
+      - ${VOLUME_PATH}/backup:/backup
+    environment:
+      - MYSQL_DATABASE=${DATABASE_NAME}
+      - MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql_root_password
+    secrets:
+      - mysql_root_password
+    restart: unless-stopped
+
+  backup:
+    build: .
+    image: fradelg/mysql-cron-backup
+    depends_on:
+      - mariadb
+    volumes:
+      - ${VOLUME_PATH}/backup:/backup
+    environment:
+      - MYSQL_HOST=my_mariadb
+      - MYSQL_USER=root
+      - MYSQL_PASS_FILE=/run/secrets/mysql_root_password
+      - MAX_BACKUPS=10
+      - INIT_BACKUP=1
+      - CRON_TIME=0 0 * * *
+    secrets:
+      - mysql_root_password
+    restart: unless-stopped
+
+volumes:
+  data:
+
+```
+
 ## Restore from a backup
 
 ### List all available backups :

From 74ad0295737c48c8f032971aa1d4ff51c5e7cebb Mon Sep 17 00:00:00 2001
From: skimpax <3287732+skimpax@users.noreply.github.com>
Date: Sat, 15 Jan 2022 13:54:58 +0100
Subject: [PATCH 067/138] Remove double quotes around MYSQLDUMP_OPTS

---
 backup.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/backup.sh b/backup.sh
index 71ba385..6b75964 100755
--- a/backup.sh
+++ b/backup.sh
@@ -21,7 +21,7 @@ do
     echo "==> Dumping database: $db"
     FILENAME=/backup/$DATE.$db.sql
     LATEST=/backup/latest.$db.sql.gz
-    if mysqldump --single-transaction -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" "$db" "$MYSQLDUMP_OPTS" > "$FILENAME"
+    if mysqldump --single-transaction -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" "$db" $MYSQLDUMP_OPTS > "$FILENAME"
     then
       gzip "-$GZIP_LEVEL" -f "$FILENAME"
       echo "==> Creating symlink to latest backup: $(basename "$FILENAME".gz)"

From 8992f162d797bdbc94160df1b560a87c09a6477e Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Fri, 4 Feb 2022 20:44:11 +0100
Subject: [PATCH 068/138] support saving non-gzipped sql files

---
 README.md  |  1 +
 backup.sh  | 25 +++++++++++++++++--------
 restore.sh | 11 +++++++++--
 3 files changed, 27 insertions(+), 10 deletions(-)

diff --git a/README.md b/README.md
index e2cd2e8..8464811 100644
--- a/README.md
+++ b/README.md
@@ -28,6 +28,7 @@ docker container run -d \
 - `INIT_RESTORE_LATEST`: If set, restores latest backup.
 - `TIMEOUT`: Wait a given number of seconds for the database to be ready and make the first backup, `10s` by default. After that time, the initial attempt for backup gives up and only the Cron job will try to make a backup.
 - `GZIP_LEVEL`: Specify the level of gzip compression from 1 (quickest, least compressed) to 9 (slowest, most compressed), default is 6.
+- `USE_PLAIN_SQL`: If set, back up and restore plain SQL files without gzip.
 - `TZ`: Specify TIMEZONE in Container. E.g. "Europe/Berlin". Default is UTC.
 
 If you want to make this image the perfect companion of your MySQL container, use [docker-compose](https://docs.docker.com/compose/). You can add more services that will be able to connect to the MySQL image using the name `my_mariadb`, note that you only expose the port `3306` internally to the servers and not to the host:
diff --git a/backup.sh b/backup.sh
index 6b75964..76a3d5a 100755
--- a/backup.sh
+++ b/backup.sh
@@ -20,19 +20,28 @@ do
   then
     echo "==> Dumping database: $db"
     FILENAME=/backup/$DATE.$db.sql
-    LATEST=/backup/latest.$db.sql.gz
-    if mysqldump --single-transaction -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" "$db" $MYSQLDUMP_OPTS > "$FILENAME"
+    LATEST=/backup/latest.$db.sql
+    if mysqldump --single-transaction -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" "$db" "$MYSQLDUMP_OPTS" > "$FILENAME"
     then
-      gzip "-$GZIP_LEVEL" -f "$FILENAME"
-      echo "==> Creating symlink to latest backup: $(basename "$FILENAME".gz)"
+      EXT=
+      if [ -z "${USE_PLAIN_SQL}" ]
+      then
+        echo "==> Compressing $db with LEVEL $GZIP_LEVEL"
+        gzip "-$GZIP_LEVEL" -f "$FILENAME"
+        EXT=.gz
+        FILENAME=$FILENAME$EXT
+        LATEST=$LATEST$EXT
+      fi
+      BASENAME=$(basename "$FILENAME")
+      echo "==> Creating symlink to latest backup: $BASENAME"
       rm "$LATEST" 2> /dev/null
-      cd /backup || exit && ln -s "$(basename "$FILENAME".gz)" "$(basename "$LATEST")"
+      cd /backup || exit && ln -s "$BASENAME" "$(basename "$LATEST")"
       if [ -n "$MAX_BACKUPS" ]
       then
-        while [ "$(find /backup -maxdepth 1 -name "*.$db.sql.gz" -type f | wc -l)" -gt "$MAX_BACKUPS" ]
+        while [ "$(find /backup -maxdepth 1 -name "*.$db.sql$EXT" -type f | wc -l)" -gt "$MAX_BACKUPS" ]
         do
-          TARGET=$(find /backup -maxdepth 1 -name "*.$db.sql.gz" -type f | sort | head -n 1)
-          echo "==> Max number of backups ($MAX_BACKUPS) reached. Deleting ${TARGET} ..."
+          TARGET=$(find /backup -maxdepth 1 -name "*.$db.sql$EXT" -type f | sort | head -n 1)
+          echo "==> Max number of ($MAX_BACKUPS) backups reached. Deleting ${TARGET} ..."
           rm -rf "${TARGET}"
           echo "==> Backup ${TARGET} deleted"
         done
diff --git a/restore.sh b/restore.sh
index 07ecbae..536a890 100755
--- a/restore.sh
+++ b/restore.sh
@@ -13,13 +13,20 @@ fi
 
 set -o pipefail
 
-SQL=$(gunzip -c "$1")
+if [ -z "${USE_PLAIN_SQL}" ]
+then 
+    SQL=$(gunzip -c "$1")
+else
+    SQL=$(cat "$1")
+fi
+
 DB_NAME=${MYSQL_DATABASE:-${MYSQL_DB}}
 if [ -z "${DB_NAME}" ]
 then
+    echo "=> Searching database name in $1"
     DB_NAME=$(echo "$SQL" | grep -oE '(Database: (.+))' | cut -d ' ' -f 2)
 fi
-[ -z "${DB_NAME}" ] && { echo "=> database name cannot be found" && exit 1; }
+[ -z "${DB_NAME}" ] && { echo "=> Database name not found" && exit 1; }
 
 echo "=> Restore database $DB_NAME from $1"
 

From f7418224036f8c089547918059c148b25d337853 Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Sat, 5 Feb 2022 13:01:53 +0100
Subject: [PATCH 069/138] fix wrong placement of MYSQLDUMP_OPTS variable

---
 Dockerfile | 3 ++-
 README.md  | 2 +-
 backup.sh  | 2 +-
 3 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/Dockerfile b/Dockerfile
index d19d572..a1ee8c1 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -29,7 +29,8 @@ COPY --from=binary /go/bin/dockerize /usr/local/bin
 ENV CRON_TIME="0 3 * * sun" \
     MYSQL_HOST="mysql" \
     MYSQL_PORT="3306" \
-    TIMEOUT="10s"
+    TIMEOUT="10s" \
+    MYSQLDUMP_OPTS="--quick"
 
 COPY ["run.sh", "backup.sh", "restore.sh", "/"]
 RUN mkdir /backup && \
diff --git a/README.md b/README.md
index 8464811..4280622 100644
--- a/README.md
+++ b/README.md
@@ -21,7 +21,7 @@ docker container run -d \
 - `MYSQL_PASS`: The password of your mysql database.
 - `MYSQL_PASS_FILE`: The file in container where to find the password of your mysql database (cf. docker secrets). You should use either MYSQL_PASS_FILE or MYSQL_PASS (see examples below).
 - `MYSQL_DATABASE`: The database name to dump. Default: `--all-databases`.
-- `MYSQLDUMP_OPTS`: Command line arguments to pass to mysqldump. Example: `--single-transaction`.
+- `MYSQLDUMP_OPTS`: Command line arguments to pass to mysqldump (see [mysqldump documentation](https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html)).
 - `CRON_TIME`: The interval of cron job to run mysqldump. `0 3 * * sun` by default, which is every Sunday at 03:00. It uses UTC timezone.
 - `MAX_BACKUPS`: The number of backups to keep. When reaching the limit, the old backup will be discarded. No limit by default.
 - `INIT_BACKUP`: If set, create a backup when the container starts.
diff --git a/backup.sh b/backup.sh
index 76a3d5a..7082e01 100755
--- a/backup.sh
+++ b/backup.sh
@@ -21,7 +21,7 @@ do
     echo "==> Dumping database: $db"
     FILENAME=/backup/$DATE.$db.sql
     LATEST=/backup/latest.$db.sql
-    if mysqldump --single-transaction -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" "$db" "$MYSQLDUMP_OPTS" > "$FILENAME"
+    if mysqldump --single-transaction "$MYSQLDUMP_OPTS" -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" "$db" > "$FILENAME"
     then
       EXT=
       if [ -z "${USE_PLAIN_SQL}" ]

From db6014ab1ac5ed05fc468c8bb526c2c9f4724a7d Mon Sep 17 00:00:00 2001
From: Motaz Abuthiab <moty66@gmail.com>
Date: Tue, 22 Feb 2022 08:49:54 +0100
Subject: [PATCH 070/138] fix issue with multiple dump extra options

mysqldump will fail if the env variable has multiple options,

issue: https://github.com/fradelg/docker-mysql-cron-backup/issues/72
---
 backup.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/backup.sh b/backup.sh
index 7082e01..b3bce4f 100755
--- a/backup.sh
+++ b/backup.sh
@@ -21,7 +21,7 @@ do
     echo "==> Dumping database: $db"
     FILENAME=/backup/$DATE.$db.sql
     LATEST=/backup/latest.$db.sql
-    if mysqldump --single-transaction "$MYSQLDUMP_OPTS" -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" "$db" > "$FILENAME"
+    if mysqldump --single-transaction $MYSQLDUMP_OPTS -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" "$db" > "$FILENAME"
     then
       EXT=
       if [ -z "${USE_PLAIN_SQL}" ]

From eb42488f004b37ea7374d8e3ff97748c14efcfff Mon Sep 17 00:00:00 2001
From: Motaz Abuthiab <moty66@gmail.com>
Date: Tue, 22 Feb 2022 08:50:03 +0100
Subject: [PATCH 071/138] fix issue with multiple dump extra options

mysqldump will fail if the env variable has multiple options,

issue: https://github.com/fradelg/docker-mysql-cron-backup/issues/72

From 331adf57b08fea1e7f244f8612c08da228563609 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 2 Mar 2022 04:35:02 +0000
Subject: [PATCH 072/138] Bump actions/checkout from 2 to 3

Bumps [actions/checkout](https://github.com/actions/checkout) from 2 to 3.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v2...v3)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
---
 .github/workflows/image.yml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml
index 7a4203a..8aab2e9 100644
--- a/.github/workflows/image.yml
+++ b/.github/workflows/image.yml
@@ -13,7 +13,7 @@ jobs:
     runs-on: ubuntu-20.04
     steps:
       - name: Checkout the code
-        uses: actions/checkout@v2
+        uses: actions/checkout@v3
       - name: Test Bash scripts
         run: sudo apt-get -qq update && sudo apt-get install -y devscripts shellcheck && make test
   build:
@@ -21,7 +21,7 @@ jobs:
     needs: test
     steps:
       - name: Checkout the code
-        uses: actions/checkout@v2
+        uses: actions/checkout@v3
       # https://github.com/docker/setup-qemu-action
       - name: Set up QEMU
         uses: docker/setup-qemu-action@v1

From ca54b7769ef511fbf2fa92db5d25d0f2220a8e9a Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 18 Mar 2022 04:22:42 +0000
Subject: [PATCH 073/138] Bump alpine from 3.15.0 to 3.15.1

Bumps alpine from 3.15.0 to 3.15.1.

---
updated-dependencies:
- dependency-name: alpine
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index a1ee8c1..1bc8a52 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,7 +12,7 @@ RUN go get github.com/robfig/glock
 RUN glock sync -n < GLOCKFILE
 RUN go install
 
-FROM alpine:3.15.0
+FROM alpine:3.15.1
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update \

From f30f90ad61c16c5bad457dd2f49a1b79c4c098e1 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 24 Mar 2022 04:25:15 +0000
Subject: [PATCH 074/138] Bump alpine from 3.15.1 to 3.15.2

Bumps alpine from 3.15.1 to 3.15.2.

---
updated-dependencies:
- dependency-name: alpine
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index 1bc8a52..e642713 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,7 +12,7 @@ RUN go get github.com/robfig/glock
 RUN glock sync -n < GLOCKFILE
 RUN go install
 
-FROM alpine:3.15.1
+FROM alpine:3.15.2
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update \

From 546533416e038fa5bcd0c499a919abdcfb92f53e Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 29 Mar 2022 04:27:05 +0000
Subject: [PATCH 075/138] Bump alpine from 3.15.2 to 3.15.3

Bumps alpine from 3.15.2 to 3.15.3.

---
updated-dependencies:
- dependency-name: alpine
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index e642713..84724c8 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,7 +12,7 @@ RUN go get github.com/robfig/glock
 RUN glock sync -n < GLOCKFILE
 RUN go install
 
-FROM alpine:3.15.2
+FROM alpine:3.15.3
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update \

From f1ba971fa0c3c273f455cc7fc2f0c2d853c16e2e Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 5 Apr 2022 04:26:24 +0000
Subject: [PATCH 076/138] Bump alpine from 3.15.3 to 3.15.4

Bumps alpine from 3.15.3 to 3.15.4.

---
updated-dependencies:
- dependency-name: alpine
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index 84724c8..8cc0a2b 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,7 +12,7 @@ RUN go get github.com/robfig/glock
 RUN glock sync -n < GLOCKFILE
 RUN go install
 
-FROM alpine:3.15.3
+FROM alpine:3.15.4
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update \

From 7e9b1fdbcf75c6e91f84467f805acaa2dbf46629 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 6 May 2022 04:25:29 +0000
Subject: [PATCH 077/138] Bump docker/setup-buildx-action from 1 to 2

Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 1 to 2.
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](https://github.com/docker/setup-buildx-action/compare/v1...v2)

---
updated-dependencies:
- dependency-name: docker/setup-buildx-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
---
 .github/workflows/image.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml
index 8aab2e9..9f290f7 100644
--- a/.github/workflows/image.yml
+++ b/.github/workflows/image.yml
@@ -27,7 +27,7 @@ jobs:
         uses: docker/setup-qemu-action@v1
       # https://github.com/docker/setup-buildx-action
       - name: Set up Docker Buildx
-        uses: docker/setup-buildx-action@v1
+        uses: docker/setup-buildx-action@v2
       - name: Get latest release version number
         id: docker-tag
         uses: yuya-takeyama/docker-tag-from-github-ref-action@v1

From 040b3e4e77f4cd7470f912a2b178f94ca35a92d7 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sat, 7 May 2022 09:53:43 +0000
Subject: [PATCH 078/138] Bump docker/setup-qemu-action from 1 to 2

Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 1 to 2.
- [Release notes](https://github.com/docker/setup-qemu-action/releases)
- [Commits](https://github.com/docker/setup-qemu-action/compare/v1...v2)

---
updated-dependencies:
- dependency-name: docker/setup-qemu-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
---
 .github/workflows/image.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml
index 9f290f7..6dba542 100644
--- a/.github/workflows/image.yml
+++ b/.github/workflows/image.yml
@@ -24,7 +24,7 @@ jobs:
         uses: actions/checkout@v3
       # https://github.com/docker/setup-qemu-action
       - name: Set up QEMU
-        uses: docker/setup-qemu-action@v1
+        uses: docker/setup-qemu-action@v2
       # https://github.com/docker/setup-buildx-action
       - name: Set up Docker Buildx
         uses: docker/setup-buildx-action@v2

From e8396b9fda394cc9179bfbcc974b2e3558341252 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 24 May 2022 04:27:53 +0000
Subject: [PATCH 079/138] Bump alpine from 3.15.4 to 3.16.0

Bumps alpine from 3.15.4 to 3.16.0.

---
updated-dependencies:
- dependency-name: alpine
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index 8cc0a2b..9b3497b 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,7 +12,7 @@ RUN go get github.com/robfig/glock
 RUN glock sync -n < GLOCKFILE
 RUN go install
 
-FROM alpine:3.15.4
+FROM alpine:3.16.0
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update \

From aca23ddb93471884efd558448d100a2873d14cd0 Mon Sep 17 00:00:00 2001
From: Alexey Kovtunovich <kovtalex@gmail.com>
Date: Tue, 14 Jun 2022 18:18:01 +0300
Subject: [PATCH 080/138] add SSL arguments

---
 README.md  | 1 +
 backup.sh  | 4 ++--
 restore.sh | 2 +-
 3 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/README.md b/README.md
index 4280622..3b21b68 100644
--- a/README.md
+++ b/README.md
@@ -22,6 +22,7 @@ docker container run -d \
 - `MYSQL_PASS_FILE`: The file in container where to find the password of your mysql database (cf. docker secrets). You should use either MYSQL_PASS_FILE or MYSQL_PASS (see examples below).
 - `MYSQL_DATABASE`: The database name to dump. Default: `--all-databases`.
 - `MYSQLDUMP_OPTS`: Command line arguments to pass to mysqldump (see [mysqldump documentation](https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html)).
+- `MYSQL_SSL_OPTS`: Command line arguments to use [SSL](https://dev.mysql.com/doc/refman/8.0/en/using-encrypted-connections.html).
 - `CRON_TIME`: The interval of cron job to run mysqldump. `0 3 * * sun` by default, which is every Sunday at 03:00. It uses UTC timezone.
 - `MAX_BACKUPS`: The number of backups to keep. When reaching the limit, the old backup will be discarded. No limit by default.
 - `INIT_BACKUP`: If set, create a backup when the container starts.
diff --git a/backup.sh b/backup.sh
index b3bce4f..d251ed7 100755
--- a/backup.sh
+++ b/backup.sh
@@ -9,7 +9,7 @@
 
 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)}}
+DATABASES=${MYSQL_DATABASE:-${MYSQL_DB:-$(mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" $MYSQL_SSL_OPTS -e "SHOW DATABASES;" | tr -d "| " | grep -v Database)}}
 for db in ${DATABASES}
 do
   if  [[ "$db" != "information_schema" ]] \
@@ -21,7 +21,7 @@ do
     echo "==> Dumping database: $db"
     FILENAME=/backup/$DATE.$db.sql
     LATEST=/backup/latest.$db.sql
-    if mysqldump --single-transaction $MYSQLDUMP_OPTS -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" "$db" > "$FILENAME"
+    if mysqldump --single-transaction $MYSQLDUMP_OPTS -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" $MYSQL_SSL_OPTS "$db" > "$FILENAME"
     then
       EXT=
       if [ -z "${USE_PLAIN_SQL}" ]
diff --git a/restore.sh b/restore.sh
index 536a890..284f653 100755
--- a/restore.sh
+++ b/restore.sh
@@ -30,7 +30,7 @@ fi
 
 echo "=> Restore database $DB_NAME from $1"
 
-if echo "$SQL" | mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" "$DB_NAME"
+if echo "$SQL" | mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" "$DB_NAME" $MYSQL_SSL_OPTS
 then
     echo "=> Restore succeeded"
 else

From 6f512df392f067a1e9a91834e61791ab81a5d5b1 Mon Sep 17 00:00:00 2001
From: Alexey Kovtunovich <kovtalex@gmail.com>
Date: Tue, 14 Jun 2022 18:32:06 +0300
Subject: [PATCH 081/138] fixed link to SSL configuration manual

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 3b21b68..5d6cfe6 100644
--- a/README.md
+++ b/README.md
@@ -21,7 +21,7 @@ docker container run -d \
 - `MYSQL_PASS`: The password of your mysql database.
 - `MYSQL_PASS_FILE`: The file in container where to find the password of your mysql database (cf. docker secrets). You should use either MYSQL_PASS_FILE or MYSQL_PASS (see examples below).
 - `MYSQL_DATABASE`: The database name to dump. Default: `--all-databases`.
-- `MYSQLDUMP_OPTS`: Command line arguments to pass to mysqldump (see [mysqldump documentation](https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html)).
+- `MYSQLDUMP_OPTS`: Command line arguments to pass to mysqldump (see [mysqldump documentation](https://dev.mysql.com/doc/refman/5.6/en/using-encrypted-connections.html).
 - `MYSQL_SSL_OPTS`: Command line arguments to use [SSL](https://dev.mysql.com/doc/refman/8.0/en/using-encrypted-connections.html).
 - `CRON_TIME`: The interval of cron job to run mysqldump. `0 3 * * sun` by default, which is every Sunday at 03:00. It uses UTC timezone.
 - `MAX_BACKUPS`: The number of backups to keep. When reaching the limit, the old backup will be discarded. No limit by default.

From 35ff2141ea1285fd881a4e52d9ddfae396066639 Mon Sep 17 00:00:00 2001
From: Alexey Kovtunovich <kovtalex@gmail.com>
Date: Tue, 14 Jun 2022 18:33:57 +0300
Subject: [PATCH 082/138] fixed link to SSL configuration manual

---
 README.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/README.md b/README.md
index 5d6cfe6..bcd60ff 100644
--- a/README.md
+++ b/README.md
@@ -21,8 +21,8 @@ docker container run -d \
 - `MYSQL_PASS`: The password of your mysql database.
 - `MYSQL_PASS_FILE`: The file in container where to find the password of your mysql database (cf. docker secrets). You should use either MYSQL_PASS_FILE or MYSQL_PASS (see examples below).
 - `MYSQL_DATABASE`: The database name to dump. Default: `--all-databases`.
-- `MYSQLDUMP_OPTS`: Command line arguments to pass to mysqldump (see [mysqldump documentation](https://dev.mysql.com/doc/refman/5.6/en/using-encrypted-connections.html).
-- `MYSQL_SSL_OPTS`: Command line arguments to use [SSL](https://dev.mysql.com/doc/refman/8.0/en/using-encrypted-connections.html).
+- `MYSQLDUMP_OPTS`: Command line arguments to pass to mysqldump (see [mysqldump documentation](https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html)).
+- `MYSQL_SSL_OPTS`: Command line arguments to use [SSL](https://dev.mysql.com/doc/refman/5.6/en/using-encrypted-connections.html).
 - `CRON_TIME`: The interval of cron job to run mysqldump. `0 3 * * sun` by default, which is every Sunday at 03:00. It uses UTC timezone.
 - `MAX_BACKUPS`: The number of backups to keep. When reaching the limit, the old backup will be discarded. No limit by default.
 - `INIT_BACKUP`: If set, create a backup when the container starts.

From 2b43049ff95843e7d52ba64599997627da394c05 Mon Sep 17 00:00:00 2001
From: Alexey Kovtunovich <kovtalex@gmail.com>
Date: Sat, 18 Jun 2022 12:25:46 +0300
Subject: [PATCH 083/138] fix restore.sh - mysql cmd

---
 restore.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/restore.sh b/restore.sh
index 284f653..15d6b81 100755
--- a/restore.sh
+++ b/restore.sh
@@ -30,7 +30,7 @@ fi
 
 echo "=> Restore database $DB_NAME from $1"
 
-if echo "$SQL" | mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" "$DB_NAME" $MYSQL_SSL_OPTS
+if echo "$SQL" | mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" $MYSQL_SSL_OPTS "$DB_NAME"
 then
     echo "=> Restore succeeded"
 else

From 6b192172851f23c50fe9cd8832503aa22918a12a Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 19 Jul 2022 04:23:29 +0000
Subject: [PATCH 084/138] Bump alpine from 3.16.0 to 3.16.1

Bumps alpine from 3.16.0 to 3.16.1.

---
updated-dependencies:
- dependency-name: alpine
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index 9b3497b..b2107ec 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,7 +12,7 @@ RUN go get github.com/robfig/glock
 RUN glock sync -n < GLOCKFILE
 RUN go install
 
-FROM alpine:3.16.0
+FROM alpine:3.16.1
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update \

From bde69eaf1afe4696061d9ed642b99503b915906e Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 10 Aug 2022 04:21:29 +0000
Subject: [PATCH 085/138] Bump alpine from 3.16.1 to 3.16.2

Bumps alpine from 3.16.1 to 3.16.2.

---
updated-dependencies:
- dependency-name: alpine
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index b2107ec..fdf3895 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,7 +12,7 @@ RUN go get github.com/robfig/glock
 RUN glock sync -n < GLOCKFILE
 RUN go install
 
-FROM alpine:3.16.1
+FROM alpine:3.16.2
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update \

From 9b542daf425568c2210cc1b8cbbf594ed7e4f64d Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Mon, 15 Aug 2022 10:20:22 +0200
Subject: [PATCH 086/138] use docker --username instead of docker -u

---
 .github/workflows/image.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml
index 6dba542..8d51bd3 100644
--- a/.github/workflows/image.yml
+++ b/.github/workflows/image.yml
@@ -32,7 +32,7 @@ jobs:
         id: docker-tag
         uses: yuya-takeyama/docker-tag-from-github-ref-action@v1
       - name: Login to Docker Hub
-        run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
+        run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login --username "${{ secrets.DOCKER_USERNAME }}" --password-stdin
       - name: Build multiarch image
         run: |
           docker buildx build --push \

From 37a840010341a1c3a58c2bf7ce979f9e615ebd78 Mon Sep 17 00:00:00 2001
From: Skimpax <2030318-skimpax@users.noreply.gitlab.com>
Date: Sat, 15 Oct 2022 07:49:01 +0200
Subject: [PATCH 087/138] Add ability to use secrets for mysql access

---
 backup.sh  | 12 ++++++++++--
 restore.sh | 12 ++++++++----
 2 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/backup.sh b/backup.sh
index d251ed7..450bb41 100755
--- a/backup.sh
+++ b/backup.sh
@@ -1,10 +1,18 @@
 #!/bin/bash
 
+# Get hostname: try read from file, else get from env
+[ -z "${MYSQL_HOST_FILE}" ] || { MYSQL_USER=$(head -1 "${MYSQL_HOST_FILE}"); }
+[ -z "${MYSQL_HOST}" ] && { echo "=> MYSQL_HOST cannot be empty" && exit 1; }
+# Get username: try read from file, else get from env
+[ -z "${MYSQL_USER_FILE}" ] || { MYSQL_USER=$(head -1 "${MYSQL_USER_FILE}"); }
 [ -z "${MYSQL_USER}" ] && { echo "=> MYSQL_USER cannot be empty" && exit 1; }
-# If provided, take password from file
+# Get password: try read from file, else get from env, else get from MYSQL_PASSWORD env
 [ -z "${MYSQL_PASS_FILE}" ] || { MYSQL_PASS=$(head -1 "${MYSQL_PASS_FILE}"); }
-# Alternatively, take it from env var
 [ -z "${MYSQL_PASS:=$MYSQL_PASSWORD}" ] && { echo "=> MYSQL_PASS cannot be empty" && exit 1; }
+# Get database name(s): try read from file, else get from env
+# Note: when from file, there can be one database name per line in that file
+[ -z "${MYSQL_DATABASE_FILE}" ] || { MYSQL_DATABASE=$(cat "${MYSQL_DATABASE_FILE}"); }
+# Get level from env, else use 6
 [ -z "${GZIP_LEVEL}" ] && { GZIP_LEVEL=6; }
 
 DATE=$(date +%Y%m%d%H%M)
diff --git a/restore.sh b/restore.sh
index 15d6b81..e17b61c 100755
--- a/restore.sh
+++ b/restore.sh
@@ -1,10 +1,14 @@
 #!/bin/bash
 
+# Get hostname: try read from file, else get from env
+[ -z "${MYSQL_HOST_FILE}" ] || { MYSQL_USER=$(head -1 "${MYSQL_HOST_FILE}"); }
+[ -z "${MYSQL_HOST}" ] && { echo "=> MYSQL_HOST cannot be empty" && exit 1; }
+# Get username: try read from file, else get from env
+[ -z "${MYSQL_USER_FILE}" ] || { MYSQL_USER=$(head -1 "${MYSQL_USER_FILE}"); }
 [ -z "${MYSQL_USER}" ] && { echo "=> MYSQL_USER cannot be empty" && exit 1; }
-# If provided, take password from file
+# Get password: try read from file, else get from env, else get from MYSQL_PASSWORD env
 [ -z "${MYSQL_PASS_FILE}" ] || { MYSQL_PASS=$(head -1 "${MYSQL_PASS_FILE}"); }
-# Alternatively, take it from env var
-[ -z "${MYSQL_PASS}" ] && { echo "=> MYSQL_PASS cannot be empty" && exit 1; }
+[ -z "${MYSQL_PASS:=$MYSQL_PASSWORD}" ] && { echo "=> MYSQL_PASS cannot be empty" && exit 1; }
 
 if [ "$#" -ne 1 ]
 then
@@ -14,7 +18,7 @@ fi
 set -o pipefail
 
 if [ -z "${USE_PLAIN_SQL}" ]
-then 
+then
     SQL=$(gunzip -c "$1")
 else
     SQL=$(cat "$1")

From 4abf8c5d9d379052c36d5c4759efe67ee4ddd8b4 Mon Sep 17 00:00:00 2001
From: Skimpax <2030318-skimpax@users.noreply.gitlab.com>
Date: Sat, 15 Oct 2022 07:55:10 +0200
Subject: [PATCH 088/138] Update Readme for secrets use

---
 README.md | 32 +++++++++++++++++++++++++-------
 1 file changed, 25 insertions(+), 7 deletions(-)

diff --git a/README.md b/README.md
index bcd60ff..8dc88b9 100644
--- a/README.md
+++ b/README.md
@@ -18,9 +18,11 @@ docker container run -d \
 - `MYSQL_HOST`: The host/ip of your mysql database.
 - `MYSQL_PORT`: The port number of your mysql database.
 - `MYSQL_USER`: The username of your mysql database.
+- `MYSQL_USER_FILE`: The file in container where to find the user of your mysql database (cf. docker secrets). You should use either MYSQL_USER_FILE or MYSQL_USER (see examples below).
 - `MYSQL_PASS`: The password of your mysql database.
 - `MYSQL_PASS_FILE`: The file in container where to find the password of your mysql database (cf. docker secrets). You should use either MYSQL_PASS_FILE or MYSQL_PASS (see examples below).
 - `MYSQL_DATABASE`: The database name to dump. Default: `--all-databases`.
+- `MYSQL_DATABASE_FILE`: The file in container where to find the database name in your mysql database (cf. docker secrets). You should use either MYSQL_DATABASE or MYSQL_DATABASE_FILE (see examples below).
 - `MYSQLDUMP_OPTS`: Command line arguments to pass to mysqldump (see [mysqldump documentation](https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html)).
 - `MYSQL_SSL_OPTS`: Command line arguments to use [SSL](https://dev.mysql.com/doc/refman/5.6/en/using-encrypted-connections.html).
 - `CRON_TIME`: The interval of cron job to run mysqldump. `0 3 * * sun` by default, which is every Sunday at 03:00. It uses UTC timezone.
@@ -79,17 +81,23 @@ volumes:
 
 The database root password passed to docker container by using [docker secrets](https://docs.docker.com/engine/swarm/).
 
-In example below, docker is in classic 'docker engine mode' (iow. not swarm mode) and secret source is a local file on host filesystem.
+In example below, docker is in classic 'docker engine mode' (iow. not swarm mode) and secret sources are local files on host filesystem.
 
-Alternatively, secret can be stored in docker secrets engine (iow. not in host filesystem).
+Alternatively, secrets can be stored in docker secrets engine (iow. not in host filesystem).
 
 ```yaml
 version: "3.7"
 
 secrets:
+  # Place your secret file somewhere on your host filesystem, with your password inside
   mysql_root_password:
-    # Place your secret file somewhere on your host filesystem, with your password inside
     file: ./secrets/mysql_root_password
+  mysql_user:
+    file: ./secrets/mysql_user
+  mysql_password:
+    file: ./secrets/mysql_password
+  mysql_database:
+    file: ./secrets/mysql_database
 
 services:
   mariadb:
@@ -101,10 +109,15 @@ services:
       - data:/var/lib/mysql
       - ${VOLUME_PATH}/backup:/backup
     environment:
-      - MYSQL_DATABASE=${DATABASE_NAME}
       - MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql_root_password
+      - MYSQL_USER_FILE=/run/secrets/mysql_user
+      - MYSQL_PASSWORD_FILE=/run/secrets/mysql_password
+      - MYSQL_DATABASE_FILE=/run/secrets/mysql_database
     secrets:
       - mysql_root_password
+      - mysql_user
+      - mysql_password
+      - mysql_database
     restart: unless-stopped
 
   backup:
@@ -116,13 +129,18 @@ services:
       - ${VOLUME_PATH}/backup:/backup
     environment:
       - MYSQL_HOST=my_mariadb
-      - MYSQL_USER=root
-      - MYSQL_PASS_FILE=/run/secrets/mysql_root_password
+      # Alternatively to MYSQL_USER_FILE, we can use MYSQL_USER=root to use root user instead
+      - MYSQL_USER_FILE=/run/secrets/mysql_user
+      # Alternatively, we can use /run/secrets/mysql_root_password when using root user
+      - MYSQL_PASS_FILE=/run/secrets/mysql_password
+      - MYSQL_DATABASE_FILE=/run/secrets/mysql_database
       - MAX_BACKUPS=10
       - INIT_BACKUP=1
       - CRON_TIME=0 0 * * *
     secrets:
-      - mysql_root_password
+      - mysql_user
+      - mysql_password
+      - mysql_database
     restart: unless-stopped
 
 volumes:

From 7bc94755f21625d210a4c0ac23e45e91b5310a5c Mon Sep 17 00:00:00 2001
From: Skimpax <2030318-skimpax@users.noreply.gitlab.com>
Date: Sun, 16 Oct 2022 21:46:12 +0200
Subject: [PATCH 089/138] Fix copy/paste errors

---
 backup.sh  | 2 +-
 restore.sh | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/backup.sh b/backup.sh
index 450bb41..33ff1b1 100755
--- a/backup.sh
+++ b/backup.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 
 # Get hostname: try read from file, else get from env
-[ -z "${MYSQL_HOST_FILE}" ] || { MYSQL_USER=$(head -1 "${MYSQL_HOST_FILE}"); }
+[ -z "${MYSQL_HOST_FILE}" ] || { MYSQL_HOST=$(head -1 "${MYSQL_HOST_FILE}"); }
 [ -z "${MYSQL_HOST}" ] && { echo "=> MYSQL_HOST cannot be empty" && exit 1; }
 # Get username: try read from file, else get from env
 [ -z "${MYSQL_USER_FILE}" ] || { MYSQL_USER=$(head -1 "${MYSQL_USER_FILE}"); }
diff --git a/restore.sh b/restore.sh
index e17b61c..0607d6f 100755
--- a/restore.sh
+++ b/restore.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 
 # Get hostname: try read from file, else get from env
-[ -z "${MYSQL_HOST_FILE}" ] || { MYSQL_USER=$(head -1 "${MYSQL_HOST_FILE}"); }
+[ -z "${MYSQL_HOST_FILE}" ] || { MYSQL_HOST=$(head -1 "${MYSQL_HOST_FILE}"); }
 [ -z "${MYSQL_HOST}" ] && { echo "=> MYSQL_HOST cannot be empty" && exit 1; }
 # Get username: try read from file, else get from env
 [ -z "${MYSQL_USER_FILE}" ] || { MYSQL_USER=$(head -1 "${MYSQL_USER_FILE}"); }

From d1f887f83c4567665e32dbbf4e0b246be6db4260 Mon Sep 17 00:00:00 2001
From: Skimpax <2030318-skimpax@users.noreply.gitlab.com>
Date: Sun, 16 Oct 2022 21:46:32 +0200
Subject: [PATCH 090/138] Add details in README

---
 README.md | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 8dc88b9..923ec5e 100644
--- a/README.md
+++ b/README.md
@@ -15,14 +15,16 @@ docker container run -d \
 
 ## Variables
 
+
 - `MYSQL_HOST`: The host/ip of your mysql database.
+- `MYSQL_HOST_FILE`: The file in container where to find the host of your mysql database (cf. docker secrets). You should use either MYSQL_HOST_FILE or MYSQL_HOST (see examples below).
 - `MYSQL_PORT`: The port number of your mysql database.
 - `MYSQL_USER`: The username of your mysql database.
 - `MYSQL_USER_FILE`: The file in container where to find the user of your mysql database (cf. docker secrets). You should use either MYSQL_USER_FILE or MYSQL_USER (see examples below).
 - `MYSQL_PASS`: The password of your mysql database.
 - `MYSQL_PASS_FILE`: The file in container where to find the password of your mysql database (cf. docker secrets). You should use either MYSQL_PASS_FILE or MYSQL_PASS (see examples below).
 - `MYSQL_DATABASE`: The database name to dump. Default: `--all-databases`.
-- `MYSQL_DATABASE_FILE`: The file in container where to find the database name in your mysql database (cf. docker secrets). You should use either MYSQL_DATABASE or MYSQL_DATABASE_FILE (see examples below).
+- `MYSQL_DATABASE_FILE`: The file in container where to find the database name(s) in your mysql database (cf. docker secrets). In that file, there can be several database names: one per line. You should use either MYSQL_DATABASE or MYSQL_DATABASE_FILE (see examples below).
 - `MYSQLDUMP_OPTS`: Command line arguments to pass to mysqldump (see [mysqldump documentation](https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html)).
 - `MYSQL_SSL_OPTS`: Command line arguments to use [SSL](https://dev.mysql.com/doc/refman/5.6/en/using-encrypted-connections.html).
 - `CRON_TIME`: The interval of cron job to run mysqldump. `0 3 * * sun` by default, which is every Sunday at 03:00. It uses UTC timezone.

From 3d32ab2a139d0b3cdff2d3db884bdfa4921ca666 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 14 Nov 2022 04:06:23 +0000
Subject: [PATCH 091/138] Bump alpine from 3.16.2 to 3.16.3

Bumps alpine from 3.16.2 to 3.16.3.

---
updated-dependencies:
- dependency-name: alpine
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index fdf3895..1a4dcd5 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,7 +12,7 @@ RUN go get github.com/robfig/glock
 RUN glock sync -n < GLOCKFILE
 RUN go install
 
-FROM alpine:3.16.2
+FROM alpine:3.16.3
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update \

From e975214636f34afe6547527e2998ada8e842327c Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 23 Nov 2022 04:08:05 +0000
Subject: [PATCH 092/138] Bump alpine from 3.16.3 to 3.17.0

Bumps alpine from 3.16.3 to 3.17.0.

---
updated-dependencies:
- dependency-name: alpine
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index 1a4dcd5..c06ccf7 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,7 +12,7 @@ RUN go get github.com/robfig/glock
 RUN glock sync -n < GLOCKFILE
 RUN go install
 
-FROM alpine:3.16.3
+FROM alpine:3.17.0
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update \

From 218bc5778c0785833dfc63a88dd574bb8bdd7e81 Mon Sep 17 00:00:00 2001
From: "g.nardiello" <giuseppe@nards.it>
Date: Thu, 5 Jan 2023 11:44:39 +0100
Subject: [PATCH 093/138] Fixed if on line 4 to accept default 0 value

---
 run.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/run.sh b/run.sh
index 95f8009..6882b95 100755
--- a/run.sh
+++ b/run.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 tail -F /mysql_backup.log &
 
-if [ "${INIT_BACKUP}" -gt "0" ]; then
+if [ "${INIT_BACKUP:-0}" -gt "0" ]; then
   echo "=> Create a backup on the startup"
   /backup.sh
 elif [ -n "${INIT_RESTORE_LATEST}" ]; then

From 400bb8c95e26cdd68340d89d60aacaad7b11a90b Mon Sep 17 00:00:00 2001
From: "g.nardiello" <giuseppe@nards.it>
Date: Thu, 5 Jan 2023 11:47:54 +0100
Subject: [PATCH 094/138] Added sort algorithm to RESTORE_LATEST script

---
 run.sh | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/run.sh b/run.sh
index 95f8009..a5151f4 100755
--- a/run.sh
+++ b/run.sh
@@ -11,7 +11,8 @@ elif [ -n "${INIT_RESTORE_LATEST}" ]; then
       echo "waiting database container..."
       sleep 1
   done
-  find /backup -maxdepth 1 -name '*.sql.gz' | tail -1 | xargs /restore.sh
+  # The [^l] is needed to exclude the latest backup file, and sort only data-tagged backups
+  find /backup -maxdepth 1 -name '[^l]*.sql.gz' | sort | tail -1 | xargs /restore.sh
 fi
 
 echo "${CRON_TIME} /backup.sh >> /mysql_backup.log 2>&1" > /tmp/crontab.conf

From 39d39915e464041792909d4c1d590f7cf45366d3 Mon Sep 17 00:00:00 2001
From: "g.nardiello" <giuseppe@nards.it>
Date: Thu, 5 Jan 2023 11:55:04 +0100
Subject: [PATCH 095/138] Added file-based HEALTHCHECK

---
 Dockerfile | 5 ++++-
 run.sh     | 2 ++
 2 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index c06ccf7..fdfa250 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -41,4 +41,7 @@ RUN mkdir /backup && \
 
 VOLUME ["/backup"]
 
-CMD dockerize -wait tcp://${MYSQL_HOST}:${MYSQL_PORT} -timeout ${TIMEOUT} /run.sh
+HEALTHCHECK --interval=2s --retries=1800 \
+	CMD stat /HEALTLY.status || exit 1
+
+ENTRYPOINT dockerize -wait tcp://${MYSQL_HOST}:${MYSQL_PORT} -timeout ${TIMEOUT} /run.sh
\ No newline at end of file
diff --git a/run.sh b/run.sh
index 95f8009..862a566 100755
--- a/run.sh
+++ b/run.sh
@@ -14,6 +14,8 @@ elif [ -n "${INIT_RESTORE_LATEST}" ]; then
   find /backup -maxdepth 1 -name '*.sql.gz' | tail -1 | xargs /restore.sh
 fi
 
+touch /HEALTLY.status
+
 echo "${CRON_TIME} /backup.sh >> /mysql_backup.log 2>&1" > /tmp/crontab.conf
 crontab /tmp/crontab.conf
 echo "=> Running cron task manager in foreground"

From 74aa80e2b362ec0bc11251c17d4c8859443dc3e5 Mon Sep 17 00:00:00 2001
From: "g.nardiello" <giuseppe@nards.it>
Date: Thu, 5 Jan 2023 11:59:16 +0100
Subject: [PATCH 096/138] Added EXIT_BACKUP feature with gracefully shutdown

---
 README.md | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 run.sh    | 21 +++++++++++++++++-
 2 files changed, 83 insertions(+), 2 deletions(-)

diff --git a/README.md b/README.md
index 923ec5e..1786703 100644
--- a/README.md
+++ b/README.md
@@ -31,6 +31,7 @@ docker container run -d \
 - `MAX_BACKUPS`: The number of backups to keep. When reaching the limit, the old backup will be discarded. No limit by default.
 - `INIT_BACKUP`: If set, create a backup when the container starts.
 - `INIT_RESTORE_LATEST`: If set, restores latest backup.
+- `EXIT_BACKUP`: If set, create a backup when the container stops.
 - `TIMEOUT`: Wait a given number of seconds for the database to be ready and make the first backup, `10s` by default. After that time, the initial attempt for backup gives up and only the Cron job will try to make a backup.
 - `GZIP_LEVEL`: Specify the level of gzip compression from 1 (quickest, least compressed) to 9 (slowest, most compressed), default is 6.
 - `USE_PLAIN_SQL`: If set, back up and restore plain SQL files without gzip.
@@ -184,4 +185,65 @@ mysql-cron-backup:
 docker container exec <your_mysql_backup_container_name> /restore.sh /backup/<your_sql_backup_gz_file>
 ```
 
-if no database name is specified, `restore.sh` will try to find the database name from the backup file.
\ No newline at end of file
+if no database name is specified, `restore.sh` will try to find the database name from the backup file.
+
+### Automatic backup and restore on container starts and stops
+
+Set `INIT_RESTORE_LATEST` to automatic restore the last backup on startup.
+Set `EXIT_BACKUP` to automatic create a last backup on shutdown.
+
+```yaml
+  mysql-cron-backup:
+    image: fradelg/mysql-cron-backup
+    depends_on:
+      - mariadb
+    volumes:
+      - ${VOLUME_PATH}/backup:/backup
+    environment:
+      - MYSQL_HOST=my_mariadb
+      - MYSQL_USER=${MYSQL_USER}
+      - MYSQL_PASS=${MYSQL_PASSWORD}
+      - MAX_BACKUPS=15
+      - INIT_RESTORE_LATEST=1
+      - EXIT_BACKUP=1
+      # Every day at 03:00
+      - CRON_TIME=0 3 * * *
+      # Make it small
+      - GZIP_LEVEL=9
+    restart: unless-stopped
+
+volumes:
+  data:
+```
+
+Docker database image could expose a directory you could add files as init sql script.
+
+```yaml
+  mysql:
+    image: mysql
+    expose:
+      - 3306
+    volumes:
+      - data:/var/lib/mysql
+      # If there is not scheme, restore using the init script (if exists)
+      - ./init-script.sql:/docker-entrypoint-initdb.d/database.sql.gz
+    environment:
+      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
+      - MYSQL_DATABASE=${DATABASE_NAME}
+    restart: unless-stopped
+```
+
+```yaml
+  mariadb:
+    image: mariadb
+    expose:
+      - 3306
+    volumes:
+      - data:/var/lib/mysql
+      # If there is not scheme, restore using the init script (if exists)
+      - ./init-script.sql:/docker-entrypoint-initdb.d/database.sql.gz
+    environment:
+      - MYSQL_ROOT_PASSWORD=${MARIADB_ROOT_PASSWORD}
+      - MYSQL_DATABASE=${DATABASE_NAME}
+    restart: unless-stopped
+```
\ No newline at end of file
diff --git a/run.sh b/run.sh
index 95f8009..ea11ae7 100755
--- a/run.sh
+++ b/run.sh
@@ -14,7 +14,26 @@ elif [ -n "${INIT_RESTORE_LATEST}" ]; then
   find /backup -maxdepth 1 -name '*.sql.gz' | tail -1 | xargs /restore.sh
 fi
 
+function final_backup {
+    echo "=> Captured trap for final backup"
+    DATE=$(date +%Y%m%d%H%M)
+    echo "=> Requested last backup at $(date "+%Y-%m-%d %H:%M:%S")"
+    exec /backup.sh
+    exit 0
+}
+
+if [ -n "${EXIT_BACKUP}" ]; then
+  echo "=> Listening on container shutdown gracefully to make last backup before close"
+  trap final_backup SIGHUP SIGINT SIGTERM
+fi
+
 echo "${CRON_TIME} /backup.sh >> /mysql_backup.log 2>&1" > /tmp/crontab.conf
 crontab /tmp/crontab.conf
 echo "=> Running cron task manager in foreground"
-exec crond -f -l 8 -L /mysql_backup.log
+crond -f -l 8 -L /mysql_backup.log &
+
+echo "Listening on crond, and wait..."
+
+while : ; do sleep 1 ; done
+
+echo "Script is shutted down."
\ No newline at end of file

From f8307fd40f7e54a870d9e518169be1abdb118f1a Mon Sep 17 00:00:00 2001
From: "g.nardiello" <giuseppe@nards.it>
Date: Fri, 6 Jan 2023 08:43:40 +0100
Subject: [PATCH 097/138] Improved docs for Healthcheck

---
 README.md | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/README.md b/README.md
index 923ec5e..8d3a2dd 100644
--- a/README.md
+++ b/README.md
@@ -13,6 +13,12 @@ docker container run -d \
        fradelg/mysql-cron-backup
 ```
 
+### Healthcheck
+
+
+Healthcheck is provided as a basic init control.
+Container is **Healthly** after the database init phase, that is after `INIT_BACKUP` or `INIT_RESTORE_LATEST` happends without check if there is an error, **Starting** otherwise. Not other checks are actually provided.
+
 ## Variables
 
 

From ee27961c60a594ad274a2da8c348b62fffe20bbc Mon Sep 17 00:00:00 2001
From: "g.nardiello" <giuseppe@nards.it>
Date: Fri, 6 Jan 2023 09:29:31 +0100
Subject: [PATCH 098/138] Delete strategy moved to new file, as could custom

---
 Dockerfile | 4 ++--
 backup.sh  | 8 +-------
 delete.sh  | 7 +++++++
 3 files changed, 10 insertions(+), 9 deletions(-)
 create mode 100755 delete.sh

diff --git a/Dockerfile b/Dockerfile
index c06ccf7..be861f9 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -32,10 +32,10 @@ ENV CRON_TIME="0 3 * * sun" \
     TIMEOUT="10s" \
     MYSQLDUMP_OPTS="--quick"
 
-COPY ["run.sh", "backup.sh", "restore.sh", "/"]
+COPY ["run.sh", "backup.sh", "restore.sh", "/delete.sh", "/"]
 RUN mkdir /backup && \
     chmod 777 /backup && \ 
-    chmod 755 /run.sh /backup.sh /restore.sh && \
+    chmod 755 /run.sh /backup.sh /restore.sh /delete.sh && \
     touch /mysql_backup.log && \
     chmod 666 /mysql_backup.log
 
diff --git a/backup.sh b/backup.sh
index 33ff1b1..70f7761 100755
--- a/backup.sh
+++ b/backup.sh
@@ -46,13 +46,7 @@ do
       cd /backup || exit && ln -s "$BASENAME" "$(basename "$LATEST")"
       if [ -n "$MAX_BACKUPS" ]
       then
-        while [ "$(find /backup -maxdepth 1 -name "*.$db.sql$EXT" -type f | wc -l)" -gt "$MAX_BACKUPS" ]
-        do
-          TARGET=$(find /backup -maxdepth 1 -name "*.$db.sql$EXT" -type f | sort | head -n 1)
-          echo "==> Max number of ($MAX_BACKUPS) backups reached. Deleting ${TARGET} ..."
-          rm -rf "${TARGET}"
-          echo "==> Backup ${TARGET} deleted"
-        done
+        exec /delete.sh
       fi
     else
       rm -rf "$FILENAME"
diff --git a/delete.sh b/delete.sh
new file mode 100755
index 0000000..59f138c
--- /dev/null
+++ b/delete.sh
@@ -0,0 +1,7 @@
+while [ "$(find /backup -maxdepth 1 -name "*.$db.sql$EXT" -type f | wc -l)" -gt "$MAX_BACKUPS" ]
+do
+    TARGET=$(find /backup -maxdepth 1 -name "*.$db.sql$EXT" -type f | sort | head -n 1)
+    echo "==> Max number of ($MAX_BACKUPS) backups reached. Deleting ${TARGET} ..."
+    rm -rf "${TARGET}"
+    echo "==> Backup ${TARGET} deleted"
+done
\ No newline at end of file

From 6b6656c540a779178df315346d984d2830bdce88 Mon Sep 17 00:00:00 2001
From: "g.nardiello" <giuseppe@nards.it>
Date: Fri, 6 Jan 2023 09:29:31 +0100
Subject: [PATCH 099/138] Delete strategy moved to new file, as could custom

---
 Dockerfile |  4 ++--
 backup.sh  |  9 ++-------
 delete.sh  | 14 ++++++++++++++
 3 files changed, 18 insertions(+), 9 deletions(-)
 create mode 100755 delete.sh

diff --git a/Dockerfile b/Dockerfile
index c06ccf7..be861f9 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -32,10 +32,10 @@ ENV CRON_TIME="0 3 * * sun" \
     TIMEOUT="10s" \
     MYSQLDUMP_OPTS="--quick"
 
-COPY ["run.sh", "backup.sh", "restore.sh", "/"]
+COPY ["run.sh", "backup.sh", "restore.sh", "/delete.sh", "/"]
 RUN mkdir /backup && \
     chmod 777 /backup && \ 
-    chmod 755 /run.sh /backup.sh /restore.sh && \
+    chmod 755 /run.sh /backup.sh /restore.sh /delete.sh && \
     touch /mysql_backup.log && \
     chmod 666 /mysql_backup.log
 
diff --git a/backup.sh b/backup.sh
index 33ff1b1..678ec3d 100755
--- a/backup.sh
+++ b/backup.sh
@@ -46,13 +46,8 @@ do
       cd /backup || exit && ln -s "$BASENAME" "$(basename "$LATEST")"
       if [ -n "$MAX_BACKUPS" ]
       then
-        while [ "$(find /backup -maxdepth 1 -name "*.$db.sql$EXT" -type f | wc -l)" -gt "$MAX_BACKUPS" ]
-        do
-          TARGET=$(find /backup -maxdepth 1 -name "*.$db.sql$EXT" -type f | sort | head -n 1)
-          echo "==> Max number of ($MAX_BACKUPS) backups reached. Deleting ${TARGET} ..."
-          rm -rf "${TARGET}"
-          echo "==> Backup ${TARGET} deleted"
-        done
+        # Execute the delete script, delete older backup or other custom delete script
+        /delete.sh $db $EXT
       fi
     else
       rm -rf "$FILENAME"
diff --git a/delete.sh b/delete.sh
new file mode 100755
index 0000000..929ed7b
--- /dev/null
+++ b/delete.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+db=$1
+EXT=$2
+
+# This file could be customized to create custom delete strategy
+
+while [ "$(find /backup -maxdepth 1 -name "*.$db.sql$EXT" -type f | wc -l)" -gt "$MAX_BACKUPS" ]
+do
+  TARGET=$(find /backup -maxdepth 1 -name "*.$db.sql$EXT" -type f | sort | head -n 1)
+  echo "==> Max number of ($MAX_BACKUPS) backups reached. Deleting ${TARGET} ..."
+  rm -rf "${TARGET}"
+  echo "==> Backup ${TARGET} deleted"
+done
\ No newline at end of file

From a2675a3c0615d1dceb177b61b1415c2a09d804f1 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 10 Jan 2023 04:06:46 +0000
Subject: [PATCH 100/138] Bump alpine from 3.17.0 to 3.17.1

Bumps alpine from 3.17.0 to 3.17.1.

---
updated-dependencies:
- dependency-name: alpine
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index be861f9..051b26d 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,7 +12,7 @@ RUN go get github.com/robfig/glock
 RUN glock sync -n < GLOCKFILE
 RUN go install
 
-FROM alpine:3.17.0
+FROM alpine:3.17.1
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update \

From 81f5e3dc69f8cc7e5dd390b98a7cedeabb8efb5b Mon Sep 17 00:00:00 2001
From: Giuseppe Nardiello <giuseppe@nards.it>
Date: Tue, 10 Jan 2023 23:55:38 +0100
Subject: [PATCH 101/138] Corrected *Healthy* typo

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 8d3a2dd..b4d98fb 100644
--- a/README.md
+++ b/README.md
@@ -17,7 +17,7 @@ docker container run -d \
 
 
 Healthcheck is provided as a basic init control.
-Container is **Healthly** after the database init phase, that is after `INIT_BACKUP` or `INIT_RESTORE_LATEST` happends without check if there is an error, **Starting** otherwise. Not other checks are actually provided.
+Container is **Healthy** after the database init phase, that is after `INIT_BACKUP` or `INIT_RESTORE_LATEST` happends without check if there is an error, **Starting** otherwise. Not other checks are actually provided.
 
 ## Variables
 

From 9bd732897e84fa87428717208b1371f367211384 Mon Sep 17 00:00:00 2001
From: Giuseppe Nardiello <giuseppe@nards.it>
Date: Tue, 17 Jan 2023 22:23:34 +0100
Subject: [PATCH 102/138] Better wait for crond

---
 run.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/run.sh b/run.sh
index ea11ae7..b2e745b 100755
--- a/run.sh
+++ b/run.sh
@@ -34,6 +34,6 @@ crond -f -l 8 -L /mysql_backup.log &
 
 echo "Listening on crond, and wait..."
 
-while : ; do sleep 1 ; done
+tail -f /dev/null & wait $!
 
 echo "Script is shutted down."
\ No newline at end of file

From 8eb4379305e9ec0bb13ce80492f7be468b434c91 Mon Sep 17 00:00:00 2001
From: Giuseppe Nardiello <giuseppe@nards.it>
Date: Tue, 17 Jan 2023 22:57:09 +0100
Subject: [PATCH 103/138] Changed find regex to explain date-format

---
 run.sh | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/run.sh b/run.sh
index a5151f4..50d9786 100755
--- a/run.sh
+++ b/run.sh
@@ -11,8 +11,9 @@ elif [ -n "${INIT_RESTORE_LATEST}" ]; then
       echo "waiting database container..."
       sleep 1
   done
-  # The [^l] is needed to exclude the latest backup file, and sort only data-tagged backups
-  find /backup -maxdepth 1 -name '[^l]*.sql.gz' | sort | tail -1 | xargs /restore.sh
+  # Needed to exclude the 'latest.<database>.sql.gz' file, consider only filenames starting with number
+  # Only data-tagged backups, eg. '202212250457.database.sql.gz', must be trapped by the regex
+  find /backup -maxdepth 1 -name '[0-9]*.*.sql.gz' | sort | tail -1 | xargs /restore.sh
 fi
 
 echo "${CRON_TIME} /backup.sh >> /mysql_backup.log 2>&1" > /tmp/crontab.conf

From b0ae6e075deea0d97dac15ed7a301ae87b626c91 Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Thu, 19 Jan 2023 19:57:03 +0100
Subject: [PATCH 104/138] update to ubuntu 22.04

---
 .github/workflows/image.yml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml
index 8d51bd3..6705901 100644
--- a/.github/workflows/image.yml
+++ b/.github/workflows/image.yml
@@ -10,14 +10,14 @@ on:
 
 jobs:
   test:
-    runs-on: ubuntu-20.04
+    runs-on: ubuntu-22.04
     steps:
       - name: Checkout the code
         uses: actions/checkout@v3
       - name: Test Bash scripts
         run: sudo apt-get -qq update && sudo apt-get install -y devscripts shellcheck && make test
   build:
-    runs-on: ubuntu-20.04
+    runs-on: ubuntu-22.04
     needs: test
     steps:
       - name: Checkout the code

From 47977b7846b1c40c061a7bc218549557749aeb77 Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Thu, 19 Jan 2023 19:57:20 +0100
Subject: [PATCH 105/138] ignore data dir

---
 .gitignore | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 .gitignore

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..6320cd2
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+data
\ No newline at end of file

From 1f5f594e14501ab85c14b231afdba8d3a0cd85ca Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Thu, 19 Jan 2023 20:01:21 +0100
Subject: [PATCH 106/138] add parenthesis to function syntax

---
 run.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/run.sh b/run.sh
index 5ebe1b3..320047c 100755
--- a/run.sh
+++ b/run.sh
@@ -16,7 +16,7 @@ elif [ -n "${INIT_RESTORE_LATEST}" ]; then
   find /backup -maxdepth 1 -name '[0-9]*.*.sql.gz' | sort | tail -1 | xargs /restore.sh
 fi
 
-function final_backup {
+function final_backup () {
     echo "=> Captured trap for final backup"
     DATE=$(date +%Y%m%d%H%M)
     echo "=> Requested last backup at $(date "+%Y-%m-%d %H:%M:%S")"

From d6217926f275b8b19a4b2f0f32b0319122e5b8d5 Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Thu, 19 Jan 2023 20:14:48 +0100
Subject: [PATCH 107/138] fix minor issues

---
 Makefile  | 2 +-
 backup.sh | 2 +-
 run.sh    | 3 +--
 3 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/Makefile b/Makefile
index dc20422..ca5d51c 100644
--- a/Makefile
+++ b/Makefile
@@ -6,7 +6,7 @@ test:
 	# Checking for syntax errors
 	set -e; for SCRIPT in *.sh; \
 	do \
-		sh -n $$SCRIPT; \
+		bash -n $$SCRIPT; \
 	done
 
 	# Checking for bashisms (currently not failing, but only listing)
diff --git a/backup.sh b/backup.sh
index 678ec3d..747cd82 100755
--- a/backup.sh
+++ b/backup.sh
@@ -47,7 +47,7 @@ do
       if [ -n "$MAX_BACKUPS" ]
       then
         # Execute the delete script, delete older backup or other custom delete script
-        /delete.sh $db $EXT
+        /delete.sh "$db" $EXT
       fi
     else
       rm -rf "$FILENAME"
diff --git a/run.sh b/run.sh
index 320047c..5990e0a 100755
--- a/run.sh
+++ b/run.sh
@@ -16,9 +16,8 @@ elif [ -n "${INIT_RESTORE_LATEST}" ]; then
   find /backup -maxdepth 1 -name '[0-9]*.*.sql.gz' | sort | tail -1 | xargs /restore.sh
 fi
 
-function final_backup () {
+function final_backup {
     echo "=> Captured trap for final backup"
-    DATE=$(date +%Y%m%d%H%M)
     echo "=> Requested last backup at $(date "+%Y-%m-%d %H:%M:%S")"
     exec /backup.sh
     exit 0

From 96ca5bb74ae3785e39ee9ca529d05436c30ae582 Mon Sep 17 00:00:00 2001
From: Giuseppe Nardiello <giuseppe@nards.it>
Date: Fri, 20 Jan 2023 12:04:19 +0100
Subject: [PATCH 108/138] Corrected HEALTHY.status typo

---
 Dockerfile | 2 +-
 run.sh     | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/Dockerfile b/Dockerfile
index fdfa250..ad9ed2b 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -42,6 +42,6 @@ RUN mkdir /backup && \
 VOLUME ["/backup"]
 
 HEALTHCHECK --interval=2s --retries=1800 \
-	CMD stat /HEALTLY.status || exit 1
+	CMD stat /HEALTHY.status || exit 1
 
 ENTRYPOINT dockerize -wait tcp://${MYSQL_HOST}:${MYSQL_PORT} -timeout ${TIMEOUT} /run.sh
\ No newline at end of file
diff --git a/run.sh b/run.sh
index 862a566..79e05ab 100755
--- a/run.sh
+++ b/run.sh
@@ -14,7 +14,7 @@ elif [ -n "${INIT_RESTORE_LATEST}" ]; then
   find /backup -maxdepth 1 -name '*.sql.gz' | tail -1 | xargs /restore.sh
 fi
 
-touch /HEALTLY.status
+touch /.status
 
 echo "${CRON_TIME} /backup.sh >> /mysql_backup.log 2>&1" > /tmp/crontab.conf
 crontab /tmp/crontab.conf

From 25729c7bc374664d75dbbb7b2c1aa4cc5166e18f Mon Sep 17 00:00:00 2001
From: Giuseppe Nardiello <giuseppe@nards.it>
Date: Fri, 20 Jan 2023 12:04:42 +0100
Subject: [PATCH 109/138] Corrected HEALTHY.status typo

---
 run.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/run.sh b/run.sh
index 79e05ab..e2cb596 100755
--- a/run.sh
+++ b/run.sh
@@ -14,7 +14,7 @@ elif [ -n "${INIT_RESTORE_LATEST}" ]; then
   find /backup -maxdepth 1 -name '*.sql.gz' | tail -1 | xargs /restore.sh
 fi
 
-touch /.status
+touch /HEALTHY.status
 
 echo "${CRON_TIME} /backup.sh >> /mysql_backup.log 2>&1" > /tmp/crontab.conf
 crontab /tmp/crontab.conf

From 9edf0dedaf66fc8cc65da26082eec7c12e467c61 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 13 Feb 2023 05:06:41 +0000
Subject: [PATCH 110/138] Bump alpine from 3.17.1 to 3.17.2

Bumps alpine from 3.17.1 to 3.17.2.

---
updated-dependencies:
- dependency-name: alpine
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index 2a95ed6..10165ba 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,7 +12,7 @@ RUN go get github.com/robfig/glock
 RUN glock sync -n < GLOCKFILE
 RUN go install
 
-FROM alpine:3.17.1
+FROM alpine:3.17.2
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update \

From 982600303d571ff1d4434809b25bf55edbf26e4e Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 30 Mar 2023 05:01:41 +0000
Subject: [PATCH 111/138] Bump alpine from 3.17.2 to 3.17.3

Bumps alpine from 3.17.2 to 3.17.3.

---
updated-dependencies:
- dependency-name: alpine
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index 10165ba..caad82c 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,7 +12,7 @@ RUN go get github.com/robfig/glock
 RUN glock sync -n < GLOCKFILE
 RUN go install
 
-FROM alpine:3.17.2
+FROM alpine:3.17.3
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update \

From e1a26c194cf1ba6906ad1c305448e1340b2a240a Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 10 May 2023 05:01:16 +0000
Subject: [PATCH 112/138] Bump alpine from 3.17.3 to 3.18.0

Bumps alpine from 3.17.3 to 3.18.0.

---
updated-dependencies:
- dependency-name: alpine
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index caad82c..40d95cb 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,7 +12,7 @@ RUN go get github.com/robfig/glock
 RUN glock sync -n < GLOCKFILE
 RUN go install
 
-FROM alpine:3.17.3
+FROM alpine:3.18.0
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update \

From d772d22dd440fa6656779e1106118e05ad6db72e Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 16 Jun 2023 05:00:59 +0000
Subject: [PATCH 113/138] Bump alpine from 3.18.0 to 3.18.2

Bumps alpine from 3.18.0 to 3.18.2.

---
updated-dependencies:
- dependency-name: alpine
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index 40d95cb..188cfe9 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,7 +12,7 @@ RUN go get github.com/robfig/glock
 RUN glock sync -n < GLOCKFILE
 RUN go install
 
-FROM alpine:3.18.0
+FROM alpine:3.18.2
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update \

From b7c09ddc1c9807a0a58542cdf4f9ce5b5e275888 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 8 Aug 2023 04:55:47 +0000
Subject: [PATCH 114/138] Bump alpine from 3.18.2 to 3.18.3

Bumps alpine from 3.18.2 to 3.18.3.

---
updated-dependencies:
- dependency-name: alpine
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index 188cfe9..fdc2638 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,7 +12,7 @@ RUN go get github.com/robfig/glock
 RUN glock sync -n < GLOCKFILE
 RUN go install
 
-FROM alpine:3.18.2
+FROM alpine:3.18.3
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update \

From bcf82ae4e6c1f42aa9416f5e2c64d316d176bbd4 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 5 Sep 2023 04:59:56 +0000
Subject: [PATCH 115/138] Bump actions/checkout from 3 to 4

Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
---
 .github/workflows/image.yml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml
index 6705901..88f1311 100644
--- a/.github/workflows/image.yml
+++ b/.github/workflows/image.yml
@@ -13,7 +13,7 @@ jobs:
     runs-on: ubuntu-22.04
     steps:
       - name: Checkout the code
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
       - name: Test Bash scripts
         run: sudo apt-get -qq update && sudo apt-get install -y devscripts shellcheck && make test
   build:
@@ -21,7 +21,7 @@ jobs:
     needs: test
     steps:
       - name: Checkout the code
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
       # https://github.com/docker/setup-qemu-action
       - name: Set up QEMU
         uses: docker/setup-qemu-action@v2

From 895f17a082527c96b7b9a1a5e4a84fda7747cf95 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 13 Sep 2023 05:03:02 +0000
Subject: [PATCH 116/138] Bump docker/setup-buildx-action from 2 to 3

Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2 to 3.
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](https://github.com/docker/setup-buildx-action/compare/v2...v3)

---
updated-dependencies:
- dependency-name: docker/setup-buildx-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
---
 .github/workflows/image.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml
index 88f1311..80d5cc9 100644
--- a/.github/workflows/image.yml
+++ b/.github/workflows/image.yml
@@ -27,7 +27,7 @@ jobs:
         uses: docker/setup-qemu-action@v2
       # https://github.com/docker/setup-buildx-action
       - name: Set up Docker Buildx
-        uses: docker/setup-buildx-action@v2
+        uses: docker/setup-buildx-action@v3
       - name: Get latest release version number
         id: docker-tag
         uses: yuya-takeyama/docker-tag-from-github-ref-action@v1

From 554424bbc5e3dfc8ca619ed8d77c42f595aa307d Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 15 Sep 2023 17:07:34 +0000
Subject: [PATCH 117/138] Bump docker/setup-qemu-action from 2 to 3

Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 2 to 3.
- [Release notes](https://github.com/docker/setup-qemu-action/releases)
- [Commits](https://github.com/docker/setup-qemu-action/compare/v2...v3)

---
updated-dependencies:
- dependency-name: docker/setup-qemu-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
---
 .github/workflows/image.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml
index 80d5cc9..b472c36 100644
--- a/.github/workflows/image.yml
+++ b/.github/workflows/image.yml
@@ -24,7 +24,7 @@ jobs:
         uses: actions/checkout@v4
       # https://github.com/docker/setup-qemu-action
       - name: Set up QEMU
-        uses: docker/setup-qemu-action@v2
+        uses: docker/setup-qemu-action@v3
       # https://github.com/docker/setup-buildx-action
       - name: Set up Docker Buildx
         uses: docker/setup-buildx-action@v3

From 4be928f6d021ca845d199ce921ce2a93d6cdc3bd Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Fri, 15 Sep 2023 19:56:06 +0200
Subject: [PATCH 118/138] Upgrade dockerize to 0.7.0 (#110)

* update dockerize docker instructions

* login to docker hub using action
---
 .github/workflows/image.yml |  5 ++++-
 Dockerfile                  | 10 +++++-----
 2 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml
index b472c36..e639e5f 100644
--- a/.github/workflows/image.yml
+++ b/.github/workflows/image.yml
@@ -32,7 +32,10 @@ jobs:
         id: docker-tag
         uses: yuya-takeyama/docker-tag-from-github-ref-action@v1
       - name: Login to Docker Hub
-        run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login --username "${{ secrets.DOCKER_USERNAME }}" --password-stdin
+        uses: docker/login-action@v3
+        with:
+          username: ${{ secrets.DOCKER_USERNAME }}
+          password: ${{ secrets.DOCKER_PASSWORD }}
       - name: Build multiarch image
         run: |
           docker buildx build --push \
diff --git a/Dockerfile b/Dockerfile
index fdc2638..95ad9bc 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,16 +1,16 @@
-FROM golang:1.15.8-alpine3.12 AS binary
+FROM golang:1.20.4-alpine3.18 AS binary
 RUN apk -U add openssl git
 
-ARG DOCKERIZE_VERSION=v0.6.1
+ARG DOCKERIZE_VERSION=v0.7.0
 WORKDIR /go/src/github.com/jwilder
 RUN git clone https://github.com/jwilder/dockerize.git && \
     cd dockerize && \
     git checkout ${DOCKERIZE_VERSION}
 
 WORKDIR /go/src/github.com/jwilder/dockerize
-RUN go get github.com/robfig/glock
-RUN glock sync -n < GLOCKFILE
-RUN go install
+ENV GO111MODULE=on
+RUN go mod tidy
+RUN CGO_ENABLED=0 GOOS=linux GO111MODULE=on go build -a -o /go/bin/dockerize .
 
 FROM alpine:3.18.3
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"

From e52061d4fab332d3b07234a1a3914f82ba5a385c Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Sun, 17 Sep 2023 11:01:33 +0200
Subject: [PATCH 119/138] Test docker image before pushing to docker hub (#111)

* update dockerize docker instructions

* use go with alpine

* login to docker hub using action too

* test docker image before building

* extract command from the entrypoint

* change volume path

* user docker compose run and cmd instead entrypoint
---
 .github/workflows/image.yml | 10 ++++++++++
 Dockerfile                  |  2 +-
 restore.sh                  |  1 +
 3 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml
index e639e5f..1fe4d25 100644
--- a/.github/workflows/image.yml
+++ b/.github/workflows/image.yml
@@ -16,6 +16,16 @@ jobs:
         uses: actions/checkout@v4
       - name: Test Bash scripts
         run: sudo apt-get -qq update && sudo apt-get install -y devscripts shellcheck && make test
+      - name: Test image
+        env:
+          VOLUME_PATH: /tmp/mariadb 
+          DATABASE_NAME: foo
+          MARIADB_ROOT_PASSWORD: abcd 
+        run: |
+          docker-compose up -d mariadb
+          docker-compose run backup /backup.sh
+          docker-compose run backup /restore.sh /backup/latest.foo.sql.gz
+          docker-compose stop
   build:
     runs-on: ubuntu-22.04
     needs: test
diff --git a/Dockerfile b/Dockerfile
index 95ad9bc..851a5c2 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -44,4 +44,4 @@ VOLUME ["/backup"]
 HEALTHCHECK --interval=2s --retries=1800 \
 	CMD stat /HEALTHY.status || exit 1
 
-ENTRYPOINT dockerize -wait tcp://${MYSQL_HOST}:${MYSQL_PORT} -timeout ${TIMEOUT} /run.sh
\ No newline at end of file
+CMD dockerize -wait tcp://${MYSQL_HOST}:${MYSQL_PORT} -timeout ${TIMEOUT} /run.sh
diff --git a/restore.sh b/restore.sh
index 0607d6f..6c03634 100755
--- a/restore.sh
+++ b/restore.sh
@@ -13,6 +13,7 @@
 if [ "$#" -ne 1 ]
 then
     echo "You must pass the path of the backup file to restore"
+    exit 1
 fi
 
 set -o pipefail

From 549f30ef6fd56011e1b19af82e979365497b1b60 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 29 Sep 2023 04:49:58 +0000
Subject: [PATCH 120/138] Bump alpine from 3.18.3 to 3.18.4

Bumps alpine from 3.18.3 to 3.18.4.

---
updated-dependencies:
- dependency-name: alpine
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index 851a5c2..55b0e95 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,7 +12,7 @@ ENV GO111MODULE=on
 RUN go mod tidy
 RUN CGO_ENABLED=0 GOOS=linux GO111MODULE=on go build -a -o /go/bin/dockerize .
 
-FROM alpine:3.18.3
+FROM alpine:3.18.4
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update \

From f8addec08ff1b25e5c8e800763803058b7732ad7 Mon Sep 17 00:00:00 2001
From: nikgli <niklagligorovski@outlook.com>
Date: Thu, 2 Nov 2023 14:28:58 +0800
Subject: [PATCH 121/138] Fixed access denied (at least one of) the PROCESS
 privilege(s) is required error

---
 README.md | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/README.md b/README.md
index 6627b0d..dad5be3 100644
--- a/README.md
+++ b/README.md
@@ -80,6 +80,8 @@ services:
       - CRON_TIME=0 3 * * *
       # Make it small
       - GZIP_LEVEL=9
+      # As of MySQL 8.0.21 this is needed
+      - MYSQLDUMP_OPTS=--no-tablespaces
     restart: unless-stopped
 
 volumes:

From a84b82077fb52680f887dfc15701d3c0507f6d96 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 1 Dec 2023 04:59:07 +0000
Subject: [PATCH 122/138] Bump alpine from 3.18.4 to 3.18.5

Bumps alpine from 3.18.4 to 3.18.5.

---
updated-dependencies:
- dependency-name: alpine
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index 55b0e95..5318e57 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,7 +12,7 @@ ENV GO111MODULE=on
 RUN go mod tidy
 RUN CGO_ENABLED=0 GOOS=linux GO111MODULE=on go build -a -o /go/bin/dockerize .
 
-FROM alpine:3.18.4
+FROM alpine:3.18.5
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update \

From 9c84748595070927a1d9e76d7bfc85fb1acc8368 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 8 Dec 2023 04:20:17 +0000
Subject: [PATCH 123/138] Bump alpine from 3.18.5 to 3.19.0

Bumps alpine from 3.18.5 to 3.19.0.

---
updated-dependencies:
- dependency-name: alpine
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index 5318e57..26e3c72 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,7 +12,7 @@ ENV GO111MODULE=on
 RUN go mod tidy
 RUN CGO_ENABLED=0 GOOS=linux GO111MODULE=on go build -a -o /go/bin/dockerize .
 
-FROM alpine:3.18.5
+FROM alpine:3.19.0
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update \

From d20b5ea8a9b1ddfb80519b28de4ed6375367c458 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 29 Jan 2024 04:23:47 +0000
Subject: [PATCH 124/138] Bump alpine from 3.19.0 to 3.19.1

Bumps alpine from 3.19.0 to 3.19.1.

---
updated-dependencies:
- dependency-name: alpine
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index 26e3c72..60c89dd 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,7 +12,7 @@ ENV GO111MODULE=on
 RUN go mod tidy
 RUN CGO_ENABLED=0 GOOS=linux GO111MODULE=on go build -a -o /go/bin/dockerize .
 
-FROM alpine:3.19.0
+FROM alpine:3.19.1
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update \

From efe543062965af7f8d0cb0b1fd12f6b1e8d41799 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 23 May 2024 04:30:24 +0000
Subject: [PATCH 125/138] Bump alpine from 3.19.1 to 3.20.0

Bumps alpine from 3.19.1 to 3.20.0.

---
updated-dependencies:
- dependency-name: alpine
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index 60c89dd..ddbd6ab 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,7 +12,7 @@ ENV GO111MODULE=on
 RUN go mod tidy
 RUN CGO_ENABLED=0 GOOS=linux GO111MODULE=on go build -a -o /go/bin/dockerize .
 
-FROM alpine:3.19.1
+FROM alpine:3.20.0
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update \

From 7fbc2fb79e1b4a0f5a63289edf88200fc204d284 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 21 Jun 2024 04:44:44 +0000
Subject: [PATCH 126/138] Bump alpine from 3.20.0 to 3.20.1

Bumps alpine from 3.20.0 to 3.20.1.

---
updated-dependencies:
- dependency-name: alpine
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index ddbd6ab..c3fb7e3 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,7 +12,7 @@ ENV GO111MODULE=on
 RUN go mod tidy
 RUN CGO_ENABLED=0 GOOS=linux GO111MODULE=on go build -a -o /go/bin/dockerize .
 
-FROM alpine:3.20.0
+FROM alpine:3.20.1
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update \

From 9e325e3ef7d0e9f4baf06c6d366bb7b60e7a8c14 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 23 Jul 2024 04:19:30 +0000
Subject: [PATCH 127/138] Bump alpine from 3.20.1 to 3.20.2

Bumps alpine from 3.20.1 to 3.20.2.

---
updated-dependencies:
- dependency-name: alpine
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index c3fb7e3..0c0de4c 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,7 +12,7 @@ ENV GO111MODULE=on
 RUN go mod tidy
 RUN CGO_ENABLED=0 GOOS=linux GO111MODULE=on go build -a -o /go/bin/dockerize .
 
-FROM alpine:3.20.1
+FROM alpine:3.20.2
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update \

From 23cf857487cd668c1e3d16a8cf10570825a9cc50 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 9 Sep 2024 04:30:04 +0000
Subject: [PATCH 128/138] Bump alpine from 3.20.2 to 3.20.3

Bumps alpine from 3.20.2 to 3.20.3.

---
updated-dependencies:
- dependency-name: alpine
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index 0c0de4c..51fbf16 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,7 +12,7 @@ ENV GO111MODULE=on
 RUN go mod tidy
 RUN CGO_ENABLED=0 GOOS=linux GO111MODULE=on go build -a -o /go/bin/dockerize .
 
-FROM alpine:3.20.2
+FROM alpine:3.20.3
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update \

From 353430ff83f7177125f011fdc7068d2c6af6279f Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Tue, 10 Sep 2024 19:25:10 +0200
Subject: [PATCH 129/138] move to docker v2

---
 .github/workflows/image.yml | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml
index 1fe4d25..d1b827f 100644
--- a/.github/workflows/image.yml
+++ b/.github/workflows/image.yml
@@ -22,10 +22,10 @@ jobs:
           DATABASE_NAME: foo
           MARIADB_ROOT_PASSWORD: abcd 
         run: |
-          docker-compose up -d mariadb
-          docker-compose run backup /backup.sh
-          docker-compose run backup /restore.sh /backup/latest.foo.sql.gz
-          docker-compose stop
+          docker compose up -d mariadb
+          docker compose run backup /backup.sh
+          docker compose run backup /restore.sh /backup/latest.foo.sql.gz
+          docker compose stop
   build:
     runs-on: ubuntu-22.04
     needs: test
@@ -50,4 +50,4 @@ jobs:
         run: |
           docker buildx build --push \
             --tag fradelg/mysql-cron-backup:${{ steps.docker-tag.outputs.tag }} \
-            --platform linux/amd64,linux/arm/v7,linux/arm64 .
\ No newline at end of file
+            --platform linux/amd64,linux/arm/v7,linux/arm64 .

From 07213e81358665a17117297f95104898989d0958 Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Tue, 10 Sep 2024 19:37:59 +0200
Subject: [PATCH 130/138] use service name for dns

---
 docker-compose.yaml | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/docker-compose.yaml b/docker-compose.yaml
index d0b693f..e154335 100644
--- a/docker-compose.yaml
+++ b/docker-compose.yaml
@@ -2,7 +2,6 @@ version: "2"
 services:
   mariadb:
     image: mariadb:10
-    container_name: my_mariadb
     expose:
       - 3306
     volumes:
@@ -21,7 +20,7 @@ services:
     volumes:
       - ${VOLUME_PATH}/backup:/backup
     environment:
-      - MYSQL_HOST=my_mariadb
+      - MYSQL_HOST=mariadb
       - MYSQL_USER=root
       - MYSQL_PASS=${MARIADB_ROOT_PASSWORD}
       - MAX_BACKUPS=1
@@ -30,4 +29,4 @@ services:
     restart: unless-stopped
   
 volumes: 
-  data:
\ No newline at end of file
+  data:

From a715b4946cd805a0f26aba557b721904696e8c66 Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Tue, 10 Sep 2024 19:47:30 +0200
Subject: [PATCH 131/138] add health check

---
 docker-compose.yaml | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/docker-compose.yaml b/docker-compose.yaml
index e154335..6dfbf75 100644
--- a/docker-compose.yaml
+++ b/docker-compose.yaml
@@ -2,6 +2,7 @@ version: "2"
 services:
   mariadb:
     image: mariadb:10
+    container_name: my_mariadb
     expose:
       - 3306
     volumes:
@@ -10,17 +11,23 @@ services:
     environment:
       - MYSQL_DATABASE=${DATABASE_NAME}
       - MYSQL_ROOT_PASSWORD=${MARIADB_ROOT_PASSWORD}
+      - MYSQL_ALLOW_EMPTY_ROOT_PASSWORD=yes
     restart: unless-stopped
+    healthcheck:
+      test: ["CMD", "healthcheck.sh", "--su-mysql", "--connect"]
+      timeout: 5s
+      retries: 10
 
   backup:
     build: .
     image: fradelg/mysql-cron-backup
     depends_on:
-      - mariadb
+      mariadb:
+        condition: service_healthy
     volumes:
       - ${VOLUME_PATH}/backup:/backup
     environment:
-      - MYSQL_HOST=mariadb
+      - MYSQL_HOST=my_mariadb
       - MYSQL_USER=root
       - MYSQL_PASS=${MARIADB_ROOT_PASSWORD}
       - MAX_BACKUPS=1

From dac06953c32e804bf39f6599dc6fc14f4c123464 Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Tue, 10 Sep 2024 19:52:19 +0200
Subject: [PATCH 132/138] do not mask docker username

---
 .github/workflows/image.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml
index d1b827f..5827146 100644
--- a/.github/workflows/image.yml
+++ b/.github/workflows/image.yml
@@ -44,7 +44,7 @@ jobs:
       - name: Login to Docker Hub
         uses: docker/login-action@v3
         with:
-          username: ${{ secrets.DOCKER_USERNAME }}
+          username: fradelg
           password: ${{ secrets.DOCKER_PASSWORD }}
       - name: Build multiarch image
         run: |

From aebb29ab640d935698301a0412dbc3969429de2b Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 6 Dec 2024 04:39:42 +0000
Subject: [PATCH 133/138] Bump alpine from 3.20.3 to 3.21.0

Bumps alpine from 3.20.3 to 3.21.0.

---
updated-dependencies:
- dependency-name: alpine
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index 51fbf16..e363c48 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,7 +12,7 @@ ENV GO111MODULE=on
 RUN go mod tidy
 RUN CGO_ENABLED=0 GOOS=linux GO111MODULE=on go build -a -o /go/bin/dockerize .
 
-FROM alpine:3.20.3
+FROM alpine:3.21.0
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update \

From 823343381d42e055998106cb492ae18908cc8dc0 Mon Sep 17 00:00:00 2001
From: Tobias Janke <git@tojanke.de>
Date: Sun, 8 Dec 2024 11:12:39 +0100
Subject: [PATCH 134/138] [Feature] Remove duplicate database dumps to save
 storage space (#127)

* Replace gzip with deterministic bzip2 compression

* Exclude comments from SQL dump

* Add option to remove duplicates using fdupes

* Revert change to bzip2 as gzip can be deterministic using no-name parameter
---
 Dockerfile | 3 ++-
 README.md  | 1 +
 backup.sh  | 9 +++++++--
 3 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/Dockerfile b/Dockerfile
index 51fbf16..e6887c2 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -21,7 +21,8 @@ RUN apk add --update \
         mysql-client \
         gzip \
         openssl \
-        mariadb-connector-c && \
+        mariadb-connector-c \
+        fdupes && \
     rm -rf /var/cache/apk/*
 
 COPY --from=binary /go/bin/dockerize /usr/local/bin
diff --git a/README.md b/README.md
index dad5be3..16a2d65 100644
--- a/README.md
+++ b/README.md
@@ -42,6 +42,7 @@ Container is **Healthy** after the database init phase, that is after `INIT_BACK
 - `GZIP_LEVEL`: Specify the level of gzip compression from 1 (quickest, least compressed) to 9 (slowest, most compressed), default is 6.
 - `USE_PLAIN_SQL`: If set, back up and restore plain SQL files without gzip.
 - `TZ`: Specify TIMEZONE in Container. E.g. "Europe/Berlin". Default is UTC.
+- `REMOVE_DUPLICATES`: Use [fdupes](https://github.com/adrianlopezroche/fdupes) to remove duplicate database dumps
 
 If you want to make this image the perfect companion of your MySQL container, use [docker-compose](https://docs.docker.com/compose/). You can add more services that will be able to connect to the MySQL image using the name `my_mariadb`, note that you only expose the port `3306` internally to the servers and not to the host:
 
diff --git a/backup.sh b/backup.sh
index 747cd82..d7db8a7 100755
--- a/backup.sh
+++ b/backup.sh
@@ -29,13 +29,13 @@ do
     echo "==> Dumping database: $db"
     FILENAME=/backup/$DATE.$db.sql
     LATEST=/backup/latest.$db.sql
-    if mysqldump --single-transaction $MYSQLDUMP_OPTS -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" $MYSQL_SSL_OPTS "$db" > "$FILENAME"
+    if mysqldump --single-transaction --skip-comments $MYSQLDUMP_OPTS -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" $MYSQL_SSL_OPTS "$db" > "$FILENAME"
     then
       EXT=
       if [ -z "${USE_PLAIN_SQL}" ]
       then
         echo "==> Compressing $db with LEVEL $GZIP_LEVEL"
-        gzip "-$GZIP_LEVEL" -f "$FILENAME"
+        gzip "-$GZIP_LEVEL" -n -f "$FILENAME"
         EXT=.gz
         FILENAME=$FILENAME$EXT
         LATEST=$LATEST$EXT
@@ -44,6 +44,11 @@ do
       echo "==> Creating symlink to latest backup: $BASENAME"
       rm "$LATEST" 2> /dev/null
       cd /backup || exit && ln -s "$BASENAME" "$(basename "$LATEST")"
+      if [ -n "$REMOVE_DUPLICATES" ]
+      then
+        echo "=> Removing duplicate database dumps"
+        fdupes -idN /backup/
+      fi
       if [ -n "$MAX_BACKUPS" ]
       then
         # Execute the delete script, delete older backup or other custom delete script

From dc253cd1ea27e6582500877137bc9e26143ee6b0 Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Sun, 8 Dec 2024 12:52:35 +0100
Subject: [PATCH 135/138] stick to client 10.11 version

---
 Dockerfile          | 18 +++++++++---------
 docker-compose.yaml | 11 ++++++-----
 2 files changed, 15 insertions(+), 14 deletions(-)

diff --git a/Dockerfile b/Dockerfile
index 969c917..73a2588 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,17 +12,17 @@ ENV GO111MODULE=on
 RUN go mod tidy
 RUN CGO_ENABLED=0 GOOS=linux GO111MODULE=on go build -a -o /go/bin/dockerize .
 
-FROM alpine:3.21.0
+FROM alpine:3.20.3
 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>"
 
 RUN apk add --update \
-        tzdata \
-        bash \
-        mysql-client \
-        gzip \
-        openssl \
-        mariadb-connector-c \
-        fdupes && \
+    tzdata \
+    bash \
+    gzip \
+    openssl \
+    mysql-client=~10.11 \
+    mariadb-connector-c \
+    fdupes && \
     rm -rf /var/cache/apk/*
 
 COPY --from=binary /go/bin/dockerize /usr/local/bin
@@ -43,6 +43,6 @@ RUN mkdir /backup && \
 VOLUME ["/backup"]
 
 HEALTHCHECK --interval=2s --retries=1800 \
-	CMD stat /HEALTHY.status || exit 1
+    CMD stat /HEALTHY.status || exit 1
 
 CMD dockerize -wait tcp://${MYSQL_HOST}:${MYSQL_PORT} -timeout ${TIMEOUT} /run.sh
diff --git a/docker-compose.yaml b/docker-compose.yaml
index 6dfbf75..5ac0e9d 100644
--- a/docker-compose.yaml
+++ b/docker-compose.yaml
@@ -1,8 +1,9 @@
-version: "2"
 services:
   mariadb:
-    image: mariadb:10
+    image: mariadb:10.11
     container_name: my_mariadb
+    security_opt:
+      - seccomp:unconfined
     expose:
       - 3306
     volumes:
@@ -14,7 +15,7 @@ services:
       - MYSQL_ALLOW_EMPTY_ROOT_PASSWORD=yes
     restart: unless-stopped
     healthcheck:
-      test: ["CMD", "healthcheck.sh", "--su-mysql", "--connect"]
+      test: [ "CMD", "healthcheck.sh", "--su-mysql", "--connect" ]
       timeout: 5s
       retries: 10
 
@@ -34,6 +35,6 @@ services:
       - INIT_BACKUP=1
       - CRON_TIME=0 0 * * *
     restart: unless-stopped
-  
-volumes: 
+
+volumes:
   data:

From cff595e6340c44ac53132dd4fed93872f85f0ca4 Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <frandelhoyo@gmail.com>
Date: Sun, 8 Dec 2024 13:56:43 +0100
Subject: [PATCH 136/138] disable skip comments only when needed

---
 backup.sh           | 8 +++++++-
 docker-compose.yaml | 1 +
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/backup.sh b/backup.sh
index d7db8a7..ead820e 100755
--- a/backup.sh
+++ b/backup.sh
@@ -29,7 +29,13 @@ do
     echo "==> Dumping database: $db"
     FILENAME=/backup/$DATE.$db.sql
     LATEST=/backup/latest.$db.sql
-    if mysqldump --single-transaction --skip-comments $MYSQLDUMP_OPTS -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" $MYSQL_SSL_OPTS "$db" > "$FILENAME"
+    BASIC_OPTS="--single-transaction"
+    if [ -n "$REMOVE_DUPLICATES" ]
+    then
+      echo "WARNING: disabling comments in backup to remove deuplicate backups. Automatic database name detection won't work so set MYSQL_DATABASE on restore"
+      BASIC_OPTS="$BASIC_OPTS" --skip-comments
+    fi
+    if mysqldump $BASIC_OPTS $MYSQLDUMP_OPTS -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" $MYSQL_SSL_OPTS "$db" > "$FILENAME"
     then
       EXT=
       if [ -z "${USE_PLAIN_SQL}" ]
diff --git a/docker-compose.yaml b/docker-compose.yaml
index 5ac0e9d..64dcef0 100644
--- a/docker-compose.yaml
+++ b/docker-compose.yaml
@@ -30,6 +30,7 @@ services:
     environment:
       - MYSQL_HOST=my_mariadb
       - MYSQL_USER=root
+      - MYSQL_DATABASE=${DATABASE_NAME}
       - MYSQL_PASS=${MARIADB_ROOT_PASSWORD}
       - MAX_BACKUPS=1
       - INIT_BACKUP=1

From 8a15e59c1fef2a2f6f29f9839822b9e903691e0f Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <fradelg@Fcos-Air.home>
Date: Mon, 9 Dec 2024 12:23:08 +0100
Subject: [PATCH 137/138] skip only timestamps when needed

---
 backup.sh           | 5 ++---
 docker-compose.yaml | 1 -
 2 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/backup.sh b/backup.sh
index ead820e..499575d 100755
--- a/backup.sh
+++ b/backup.sh
@@ -32,8 +32,7 @@ do
     BASIC_OPTS="--single-transaction"
     if [ -n "$REMOVE_DUPLICATES" ]
     then
-      echo "WARNING: disabling comments in backup to remove deuplicate backups. Automatic database name detection won't work so set MYSQL_DATABASE on restore"
-      BASIC_OPTS="$BASIC_OPTS" --skip-comments
+      BASIC_OPTS="$BASIC_OPTS --skip-dump-date"
     fi
     if mysqldump $BASIC_OPTS $MYSQLDUMP_OPTS -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASS" $MYSQL_SSL_OPTS "$db" > "$FILENAME"
     then
@@ -52,7 +51,7 @@ do
       cd /backup || exit && ln -s "$BASENAME" "$(basename "$LATEST")"
       if [ -n "$REMOVE_DUPLICATES" ]
       then
-        echo "=> Removing duplicate database dumps"
+        echo "==> Removing duplicate database dumps"
         fdupes -idN /backup/
       fi
       if [ -n "$MAX_BACKUPS" ]
diff --git a/docker-compose.yaml b/docker-compose.yaml
index 64dcef0..5ac0e9d 100644
--- a/docker-compose.yaml
+++ b/docker-compose.yaml
@@ -30,7 +30,6 @@ services:
     environment:
       - MYSQL_HOST=my_mariadb
       - MYSQL_USER=root
-      - MYSQL_DATABASE=${DATABASE_NAME}
       - MYSQL_PASS=${MARIADB_ROOT_PASSWORD}
       - MAX_BACKUPS=1
       - INIT_BACKUP=1

From 1d3c439b654fa1d5400ccaf318d8b0ff8a051a1d Mon Sep 17 00:00:00 2001
From: "Fco. Javier Delgado del Hoyo" <fradelg@Fcos-Air.home>
Date: Mon, 9 Dec 2024 12:32:31 +0100
Subject: [PATCH 138/138] split test and build jobs

---
 .github/workflows/{image.yml => build.yml} | 22 +-----------------
 .github/workflows/test.yml                 | 26 ++++++++++++++++++++++
 2 files changed, 27 insertions(+), 21 deletions(-)
 rename .github/workflows/{image.yml => build.yml} (59%)
 create mode 100644 .github/workflows/test.yml

diff --git a/.github/workflows/image.yml b/.github/workflows/build.yml
similarity index 59%
rename from .github/workflows/image.yml
rename to .github/workflows/build.yml
index 5827146..fab409a 100644
--- a/.github/workflows/image.yml
+++ b/.github/workflows/build.yml
@@ -1,34 +1,14 @@
+
 name: build docker image
 
 on:
-  workflow_dispatch:
   push:
-    branches:
-      - "**"
     tags:
       - "**"
 
 jobs:
-  test:
-    runs-on: ubuntu-22.04
-    steps:
-      - name: Checkout the code
-        uses: actions/checkout@v4
-      - name: Test Bash scripts
-        run: sudo apt-get -qq update && sudo apt-get install -y devscripts shellcheck && make test
-      - name: Test image
-        env:
-          VOLUME_PATH: /tmp/mariadb 
-          DATABASE_NAME: foo
-          MARIADB_ROOT_PASSWORD: abcd 
-        run: |
-          docker compose up -d mariadb
-          docker compose run backup /backup.sh
-          docker compose run backup /restore.sh /backup/latest.foo.sql.gz
-          docker compose stop
   build:
     runs-on: ubuntu-22.04
-    needs: test
     steps:
       - name: Checkout the code
         uses: actions/checkout@v4
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
new file mode 100644
index 0000000..4460983
--- /dev/null
+++ b/.github/workflows/test.yml
@@ -0,0 +1,26 @@
+name: build docker image
+
+on:
+  workflow_dispatch:
+  push:
+    branches:
+      - "**"
+
+jobs:
+  test:
+    runs-on: ubuntu-22.04
+    steps:
+      - name: Checkout the code
+        uses: actions/checkout@v4
+      - name: Test Bash scripts
+        run: sudo apt-get -qq update && sudo apt-get install -y devscripts shellcheck && make test
+      - name: Test image
+        env:
+          VOLUME_PATH: /tmp/mariadb 
+          DATABASE_NAME: foo
+          MARIADB_ROOT_PASSWORD: abcd 
+        run: |
+          docker compose up -d mariadb
+          docker compose run backup /backup.sh
+          docker compose run backup /restore.sh /backup/latest.foo.sql.gz
+          docker compose stop