diff --git a/Dockerfile b/Dockerfile index 61bfa80..0a4580e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,15 @@ FROM alpine:3.10 -label maintainer="Elementar Sistemas " +LABEL maintainer="Malcolm Crum " -RUN apk --no-cache add bash py3-pip && pip3 install --no-cache-dir awscli +RUN apk --no-cache add bash py3-pip && \ + pip3 install --no-cache-dir awscli ADD watch /watch VOLUME /data +HEALTHCHECK --interval=2s --retries=300 \ + CMD stat /var/healthy.txt || exit 1 + ENV S3_SYNC_FLAGS "--delete" ENTRYPOINT [ "./watch" ] CMD ["/data"] diff --git a/Makefile b/Makefile index 54bf757..e4effa6 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,9 @@ -NAME = elementar/s3-volume +NAME = crummy/s3-volume .PHONY: build release build: - docker build -t $(NAME):latest . + docker build --platform linux/amd64 -t $(NAME):latest . release: docker push $(NAME):latest diff --git a/watch b/watch index 33dee7a..50519b0 100755 --- a/watch +++ b/watch @@ -1,4 +1,5 @@ #!/bin/bash +set -o pipefail [[ "$TRACE" ]] && set -x @@ -39,11 +40,16 @@ done PROGNAME=$0 LOCAL=$1 REMOTE=$2 +HEALTHCHECK_FILE=/var/healthy.txt if [ "$ENDPOINT_URL" ]; then AWS="aws --endpoint-url $ENDPOINT_URL" else - AWS=aws + AWS="aws" +fi + +if [ "$EXCLUDE_PATTERN" ]; then + S3_EXCLUDE_FLAGS="--exclude $EXCLUDE_PATTERN" fi function restore { @@ -54,22 +60,25 @@ function restore { fi echo "restoring $REMOTE => $LOCAL" - if ! $AWS s3 sync "$REMOTE" "$LOCAL"; then + if ! $AWS s3 sync "$REMOTE" "$LOCAL" $EXCLUDE_PATTERN; then error_exit "restore failed" fi + touch $HEALTHCHECK_FILE } function backup { echo "backup $LOCAL => $REMOTE" - if ! $AWS s3 sync "$LOCAL" "$REMOTE" $S3_SYNC_FLAGS; then + if ! $AWS s3 sync "$LOCAL" "$REMOTE" $S3_SYNC_FLAGS $EXCLUDE_PATTERN; then echo "backup failed" 1>&2 + rm $HEALTHCHECK_FILE return 1 fi + touch $HEALTHCHECK_FILE } function final_backup { echo "backup $LOCAL => $REMOTE" - while ! $AWS s3 sync "$LOCAL" "$REMOTE" $S3_SYNC_FLAGS; do + while ! $AWS s3 sync "$LOCAL" "$REMOTE" $S3_SYNC_FLAGS $EXCLUDE_PATTERN; do echo "backup failed, will retry" 1>&2 sleep 1 done