commit 73f0841f17cfa4a1b8f4cc2cf9a2509c517355e4
parent 4559e85daa31afb5120c5320760a708f2e5ea862
Author: Jeremy Lin <jeremy.lin@gmail.com>
Date: Sun, 14 Jun 2020 00:00:05 -0700
Clean up arch-specific tags if Docker Hub credentials are provided
Diffstat:
2 files changed, 42 insertions(+), 0 deletions(-)
diff --git a/hooks/README.md b/hooks/README.md
@@ -17,3 +17,4 @@ The current multi-arch image build relies on the original bitwarden_rs Dockerfil
* https://docs.docker.com/docker-hub/builds/advanced/
* https://docs.docker.com/engine/reference/commandline/manifest/
* https://www.docker.com/blog/multi-arch-build-and-images-the-simple-way/
+* https://success.docker.com/article/how-do-i-authenticate-with-the-v2-api
diff --git a/hooks/push b/hooks/push
@@ -53,3 +53,44 @@ for manifest_list in "${manifest_lists[@]}"; do
# Push the manifest list.
docker manifest push --purge ${manifest_list}
done
+
+# Avoid logging credentials and tokens.
+set +ex
+
+# Delete the arch-specific tags, if credentials for doing so are available.
+# Note that `DOCKER_PASSWORD` must be the actual user password. Passing a JWT
+# obtained using a personal access token results in a 403 error with
+# {"detail": "access to the resource is forbidden with personal access token"}
+if [[ -z "${DOCKER_USERNAME}" || -z "${DOCKER_PASSWORD}" ]]; then
+ exit 0
+fi
+
+# Given a JSON input on stdin, extract the string value associated with the
+# specified key. This avoids an extra dependency on a tool like `jq`.
+extract() {
+ local key="$1"
+ # Extract "<key>":"<val>" (assumes key/val won't contain double quotes).
+ # The colon may have whitespace on either side.
+ grep -o "\"${key}\"[[:space:]]*:[[:space:]]*\"[^\"]\+\"" |
+ # Extract just <val> by deleting the last '"', and then greedily deleting
+ # everything up to '"'.
+ sed -e 's/"$//' -e 's/.*"//'
+}
+
+echo ">>> Getting API token..."
+jwt=$(curl -sS -X POST \
+ -H "Content-Type: application/json" \
+ -d "{\"username\":\"${DOCKER_USERNAME}\",\"password\": \"${DOCKER_PASSWORD}\"}" \
+ "https://hub.docker.com/v2/users/login" |
+ extract 'token')
+
+# Strip the registry portion from `index.docker.io/user/repo`.
+repo="${DOCKER_REPO#*/}"
+
+for arch in ${arches[@]}; do
+ tag="${DOCKER_TAG}-${arch}"
+ echo ">>> Deleting '${repo}:${tag}'..."
+ curl -sS -X DELETE \
+ -H "Authorization: Bearer ${jwt}" \
+ "https://hub.docker.com/v2/repositories/${repo}/tags/${tag}/"
+done