From aebc77bdd5dc003ecaae776cbc272632fd043add Mon Sep 17 00:00:00 2001 From: crummy Date: Mon, 14 Dec 2020 07:31:57 +1300 Subject: [PATCH 1/7] Health check lets us know when sync is finished --- Dockerfile | 3 +++ watch | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/Dockerfile b/Dockerfile index 61bfa80..0d1042d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,6 +6,9 @@ ADD watch /watch VOLUME /data +HEALTHCHECK --interval=1s --timeout=1s \ + CMD stat /var/healthy.txt || exit 1 + ENV S3_SYNC_FLAGS "--delete" ENTRYPOINT [ "./watch" ] CMD ["/data"] diff --git a/watch b/watch index 33dee7a..e807a90 100755 --- a/watch +++ b/watch @@ -39,6 +39,7 @@ done PROGNAME=$0 LOCAL=$1 REMOTE=$2 +HEALTHCHECK_FILE=/var/healthy.txt if [ "$ENDPOINT_URL" ]; then AWS="aws --endpoint-url $ENDPOINT_URL" @@ -57,14 +58,17 @@ function restore { if ! $AWS s3 sync "$REMOTE" "$LOCAL"; 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 echo "backup failed" 1>&2 + rm $HEALTHCHECK_FILE return 1 fi + touch $HEALTHCHECK_FILE } function final_backup { From 94ef408307a3409cfe35f3ef4b27f59fb2ee892b Mon Sep 17 00:00:00 2001 From: Malcolm Crum Date: Mon, 8 Mar 2021 13:26:20 +1300 Subject: [PATCH 2/7] Increase timeout; it can take a while to download files --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 0d1042d..e856465 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ ADD watch /watch VOLUME /data -HEALTHCHECK --interval=1s --timeout=1s \ +HEALTHCHECK --interval=1s --timeout=60s --retries=3 \ CMD stat /var/healthy.txt || exit 1 ENV S3_SYNC_FLAGS "--delete" From 7da4ccae52c9100b922ed4af0289085f9f8abbb4 Mon Sep 17 00:00:00 2001 From: Malcolm Crum Date: Mon, 8 Mar 2021 14:16:23 +1300 Subject: [PATCH 3/7] Wait max 4min for container to boot --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index e856465..f7a430f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ ADD watch /watch VOLUME /data -HEALTHCHECK --interval=1s --timeout=60s --retries=3 \ +HEALTHCHECK --interval=2s --retries=120 \ CMD stat /var/healthy.txt || exit 1 ENV S3_SYNC_FLAGS "--delete" From 081b1df79f974b29bbb9f0793d64ee080df4dcdc Mon Sep 17 00:00:00 2001 From: Malcolm Crum Date: Thu, 11 Mar 2021 12:43:10 +1300 Subject: [PATCH 4/7] 10min timeout --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index f7a430f..d9d8cfe 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ ADD watch /watch VOLUME /data -HEALTHCHECK --interval=2s --retries=120 \ +HEALTHCHECK --interval=2s --retries=300 \ CMD stat /var/healthy.txt || exit 1 ENV S3_SYNC_FLAGS "--delete" From 40036843c1763897475f46a10da60254907c16ca Mon Sep 17 00:00:00 2001 From: crummy Date: Thu, 28 Mar 2024 19:45:44 +1300 Subject: [PATCH 5/7] Add timestamps, and support for exclusions --- Dockerfile | 5 +++-- Makefile | 2 +- watch | 13 +++++++++---- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/Dockerfile b/Dockerfile index d9d8cfe..7984ff1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,8 @@ 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 moreutils && \ + pip3 install --no-cache-dir awscli ADD watch /watch VOLUME /data diff --git a/Makefile b/Makefile index 54bf757..d540591 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -NAME = elementar/s3-volume +NAME = crummy/s3-volume .PHONY: build release diff --git a/watch b/watch index e807a90..eef4c91 100755 --- a/watch +++ b/watch @@ -40,11 +40,16 @@ PROGNAME=$0 LOCAL=$1 REMOTE=$2 HEALTHCHECK_FILE=/var/healthy.txt +TIMESTAMPS="ts '[%Y-%m-%d %H:%M:%S]'" 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 { @@ -55,7 +60,7 @@ function restore { fi echo "restoring $REMOTE => $LOCAL" - if ! $AWS s3 sync "$REMOTE" "$LOCAL"; then + if ! $AWS s3 sync "$REMOTE" "$LOCAL" $EXCLUDE_PATTERN | $TIMESTAMPS; then error_exit "restore failed" fi touch $HEALTHCHECK_FILE @@ -63,7 +68,7 @@ function restore { 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 | $TIMESTAMPS; then echo "backup failed" 1>&2 rm $HEALTHCHECK_FILE return 1 @@ -73,7 +78,7 @@ function backup { 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 | $TIMESTAMPS; do echo "backup failed, will retry" 1>&2 sleep 1 done From 0516152322f8cb17967ef2e8b072ac5637c1bfcb Mon Sep 17 00:00:00 2001 From: crummy Date: Thu, 28 Mar 2024 20:17:37 +1300 Subject: [PATCH 6/7] Make sure failures are properly caught --- Makefile | 2 +- watch | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index d540591..e4effa6 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ 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 eef4c91..156434d 100755 --- a/watch +++ b/watch @@ -1,4 +1,5 @@ #!/bin/bash +set -o pipefail [[ "$TRACE" ]] && set -x @@ -40,7 +41,6 @@ PROGNAME=$0 LOCAL=$1 REMOTE=$2 HEALTHCHECK_FILE=/var/healthy.txt -TIMESTAMPS="ts '[%Y-%m-%d %H:%M:%S]'" if [ "$ENDPOINT_URL" ]; then AWS="aws --endpoint-url $ENDPOINT_URL" @@ -60,7 +60,7 @@ function restore { fi echo "restoring $REMOTE => $LOCAL" - if ! $AWS s3 sync "$REMOTE" "$LOCAL" $EXCLUDE_PATTERN | $TIMESTAMPS; then + if ! $AWS s3 sync "$REMOTE" "$LOCAL" $EXCLUDE_PATTERN | ts '[%F %T]'; then error_exit "restore failed" fi touch $HEALTHCHECK_FILE @@ -68,7 +68,7 @@ function restore { function backup { echo "backup $LOCAL => $REMOTE" - if ! $AWS s3 sync "$LOCAL" "$REMOTE" $S3_SYNC_FLAGS $EXCLUDE_PATTERN | $TIMESTAMPS; then + if ! $AWS s3 sync "$LOCAL" "$REMOTE" $S3_SYNC_FLAGS $EXCLUDE_PATTERN | ts '[%F %T]'; then echo "backup failed" 1>&2 rm $HEALTHCHECK_FILE return 1 @@ -78,7 +78,7 @@ function backup { function final_backup { echo "backup $LOCAL => $REMOTE" - while ! $AWS s3 sync "$LOCAL" "$REMOTE" $S3_SYNC_FLAGS $EXCLUDE_PATTERN | $TIMESTAMPS; do + while ! $AWS s3 sync "$LOCAL" "$REMOTE" $S3_SYNC_FLAGS $EXCLUDE_PATTERN | ts '[%F %T]'; do echo "backup failed, will retry" 1>&2 sleep 1 done From 8a172b001a89a8eae73d13626226506f133b2c94 Mon Sep 17 00:00:00 2001 From: crummy Date: Thu, 28 Mar 2024 20:42:10 +1300 Subject: [PATCH 7/7] No point in adding timestamps, just use docker logs --timestamps --- Dockerfile | 2 +- watch | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 7984ff1..0a4580e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM alpine:3.10 LABEL maintainer="Malcolm Crum " -RUN apk --no-cache add bash py3-pip moreutils && \ +RUN apk --no-cache add bash py3-pip && \ pip3 install --no-cache-dir awscli ADD watch /watch diff --git a/watch b/watch index 156434d..50519b0 100755 --- a/watch +++ b/watch @@ -60,7 +60,7 @@ function restore { fi echo "restoring $REMOTE => $LOCAL" - if ! $AWS s3 sync "$REMOTE" "$LOCAL" $EXCLUDE_PATTERN | ts '[%F %T]'; then + if ! $AWS s3 sync "$REMOTE" "$LOCAL" $EXCLUDE_PATTERN; then error_exit "restore failed" fi touch $HEALTHCHECK_FILE @@ -68,7 +68,7 @@ function restore { function backup { echo "backup $LOCAL => $REMOTE" - if ! $AWS s3 sync "$LOCAL" "$REMOTE" $S3_SYNC_FLAGS $EXCLUDE_PATTERN | ts '[%F %T]'; then + if ! $AWS s3 sync "$LOCAL" "$REMOTE" $S3_SYNC_FLAGS $EXCLUDE_PATTERN; then echo "backup failed" 1>&2 rm $HEALTHCHECK_FILE return 1 @@ -78,7 +78,7 @@ function backup { function final_backup { echo "backup $LOCAL => $REMOTE" - while ! $AWS s3 sync "$LOCAL" "$REMOTE" $S3_SYNC_FLAGS $EXCLUDE_PATTERN | ts '[%F %T]'; do + while ! $AWS s3 sync "$LOCAL" "$REMOTE" $S3_SYNC_FLAGS $EXCLUDE_PATTERN; do echo "backup failed, will retry" 1>&2 sleep 1 done