diff --git a/backup/Dockerfile b/backup/Dockerfile index fc73888b364bd25805383452c423d6a2e53333a9..274cba84e3eb9f1276bc754ff3bb2af9f3f763b3 100644 --- a/backup/Dockerfile +++ b/backup/Dockerfile @@ -3,6 +3,7 @@ FROM docker.io/library/alpine:3.14 RUN echo 'https://dl-cdn.alpinelinux.org/alpine/edge/testing' >> /etc/apk/repositories && \ echo 'https://dl-cdn.alpinelinux.org/alpine/edge/community' >> /etc/apk/repositories && \ apk add --update --no-cache \ + findutils \ skopeo \ reg \ ; diff --git a/backup/backup b/backup/backup index fb889fab80b3f585808b0a1c10bea4cee0b5f85a..fe42de0fadd0b25e7a8952124f3626c0c687c8c5 100755 --- a/backup/backup +++ b/backup/backup @@ -17,6 +17,8 @@ then exit 1 fi +command -v skopeo >/dev/null || { echo 'skopeo is missing.' >&2; exit 2; } + registry="$1" dest="$2" @@ -44,6 +46,7 @@ NR>2 { } } END { - exit retruncode + if ( exitcode == 1) print "Backup failed for some images." + exit exitcode } ' diff --git a/backup/restore b/backup/restore index 1a2485251c33a70432394c93fb89330ef214bfc9..6dc6cf0daa29bd664fca6b8eccc5b62be856eb61 100755 --- a/backup/restore +++ b/backup/restore @@ -1 +1,62 @@ #!/bin/sh +set -eu + +usage() { + echo "$0: BACKUP_SOURCE REGISTRY_DOMAIN" +} + +if [ "${1:-}" = -h ] || [ "${1:-}" = --help ] +then + usage + exit 0 +fi + +if [ "$#" -ne 2 ] +then + usage + exit 1 +fi + +command -v skopeo >/dev/null || { echo 'skopeo is missing.' >&2; exit 2; } + +src="$1" +registry="$2" + +# There's an assumption here that filenames don't have spaces (or other such +# characters) as the image format prohibits that and I don't want to deal with +# such issues right now. + +images="$(find "$src" -maxdepth 1 -mindepth 1 -type d -printf '%f\n')" +if [ -z "$images" ] +then + echo 'No images found,' >&2 + exit 3 +fi + +returncode=0 +for image in $images +do + tags="$(find "$src/$image" -maxdepth 1 -mindepth 1 -type f -name '*.tar' -printf '%f\n' | sed 's/\.tar$//g')" + if [ -z "$tags" ] + then + echo "No tags found for image $image, skipping." >&2 + continue + fi + for tag in $tags + do + echo "Restoring $image:$tag" >&2 + if skopeo copy "docker-archive://$src/$image/$tag.tar" "docker://$registry/$image:$tag" + then + echo "Restore finished successfully." >&2 + else + echo "Restore failed, continuing with other image." >&2 + returncode=1 + fi + done +done + +if [ "$returncode" -gt 0 ] +then + echo 'Restoration failed for some images.' +fi +exit "$returncode"