diff --git a/.github/workflows/build.yml b/.github/workflows/image.yml similarity index 51% rename from .github/workflows/build.yml rename to .github/workflows/image.yml index fab409a..6705901 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/image.yml @@ -1,33 +1,40 @@ - name: build docker image on: + workflow_dispatch: push: + branches: + - "**" tags: - "**" jobs: - build: + test: runs-on: ubuntu-22.04 steps: - name: Checkout the code - uses: actions/checkout@v4 + 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-22.04 + needs: test + steps: + - name: Checkout the code + uses: actions/checkout@v3 # https://github.com/docker/setup-qemu-action - name: Set up QEMU - uses: docker/setup-qemu-action@v3 + uses: docker/setup-qemu-action@v2 # https://github.com/docker/setup-buildx-action - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 + 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 - name: Login to Docker Hub - uses: docker/login-action@v3 - with: - username: fradelg - password: ${{ secrets.DOCKER_PASSWORD }} + run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login --username "${{ secrets.DOCKER_USERNAME }}" --password-stdin - name: Build multiarch image run: | docker buildx build --push \ --tag fradelg/mysql-cron-backup:${{ steps.docker-tag.outputs.tag }} \ - --platform linux/amd64,linux/arm/v7,linux/arm64 . + --platform linux/amd64,linux/arm/v7,linux/arm64 . \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index 4460983..0000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,26 +0,0 @@ -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 diff --git a/Dockerfile b/Dockerfile index 73a2588..2a95ed6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,28 +1,27 @@ -FROM golang:1.20.4-alpine3.18 AS binary +FROM golang:1.15.8-alpine3.12 AS binary RUN apk -U add openssl git -ARG DOCKERIZE_VERSION=v0.7.0 +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 -ENV GO111MODULE=on -RUN go mod tidy -RUN CGO_ENABLED=0 GOOS=linux GO111MODULE=on go build -a -o /go/bin/dockerize . +RUN go get github.com/robfig/glock +RUN glock sync -n < GLOCKFILE +RUN go install -FROM alpine:3.20.3 +FROM alpine:3.17.1 LABEL maintainer "Fco. Javier Delgado del Hoyo <frandelhoyo@gmail.com>" RUN apk add --update \ - tzdata \ - bash \ - gzip \ - openssl \ - mysql-client=~10.11 \ - mariadb-connector-c \ - fdupes && \ + tzdata \ + bash \ + mysql-client \ + gzip \ + openssl \ + mariadb-connector-c && \ rm -rf /var/cache/apk/* COPY --from=binary /go/bin/dockerize /usr/local/bin @@ -43,6 +42,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 +ENTRYPOINT dockerize -wait tcp://${MYSQL_HOST}:${MYSQL_PORT} -timeout ${TIMEOUT} /run.sh \ No newline at end of file diff --git a/README.md b/README.md index 16a2d65..6627b0d 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,6 @@ 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: @@ -81,8 +80,6 @@ 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: diff --git a/backup.sh b/backup.sh index 499575d..747cd82 100755 --- a/backup.sh +++ b/backup.sh @@ -29,18 +29,13 @@ do echo "==> Dumping database: $db" FILENAME=/backup/$DATE.$db.sql LATEST=/backup/latest.$db.sql - BASIC_OPTS="--single-transaction" - if [ -n "$REMOVE_DUPLICATES" ] - then - 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" + 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}" ] then echo "==> Compressing $db with LEVEL $GZIP_LEVEL" - gzip "-$GZIP_LEVEL" -n -f "$FILENAME" + gzip "-$GZIP_LEVEL" -f "$FILENAME" EXT=.gz FILENAME=$FILENAME$EXT LATEST=$LATEST$EXT @@ -49,11 +44,6 @@ 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 diff --git a/docker-compose.yaml b/docker-compose.yaml index 5ac0e9d..d0b693f 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,9 +1,8 @@ +version: "2" services: mariadb: - image: mariadb:10.11 + image: mariadb:10 container_name: my_mariadb - security_opt: - - seccomp:unconfined expose: - 3306 volumes: @@ -12,19 +11,13 @@ 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: - condition: service_healthy + - mariadb volumes: - ${VOLUME_PATH}/backup:/backup environment: @@ -35,6 +28,6 @@ services: - INIT_BACKUP=1 - CRON_TIME=0 0 * * * restart: unless-stopped - -volumes: - data: + +volumes: + data: \ No newline at end of file diff --git a/restore.sh b/restore.sh index 6c03634..0607d6f 100755 --- a/restore.sh +++ b/restore.sh @@ -13,7 +13,6 @@ if [ "$#" -ne 1 ] then echo "You must pass the path of the backup file to restore" - exit 1 fi set -o pipefail