77 lines
2.2 KiB
Bash
Executable File
77 lines
2.2 KiB
Bash
Executable File
#!/bin/bash
|
|
set -ex
|
|
|
|
# base docker image tag
|
|
TAG="andig/traefik-certs-dumper"
|
|
|
|
# only linux for now
|
|
OS=linux
|
|
|
|
# target platforms in docker manifest notation
|
|
declare -a PLATFORMS=( "amd64" "arm.v6" )
|
|
|
|
# images from Dockerfile
|
|
IMAGE=$(grep "FROM alpine" < Dockerfile | sed "s/FROM //" | sed 's/\$.*//')
|
|
|
|
# manifest cache file
|
|
MANIFEST_FILE=/tmp/manifest.$IMAGE.json
|
|
|
|
# get platform image hash from docker manifest
|
|
function hash () {
|
|
local ARCHITECTURE VARIANT HASH
|
|
read -r ARCHITECTURE VARIANT <<< "$@"
|
|
|
|
if [ -z "$VARIANT" ]; then
|
|
HASH=$(jq -r ".manifests[] | select(.platform.architecture == \"$ARCHITECTURE\") | .digest" < "$MANIFEST_FILE")
|
|
else
|
|
HASH=$(jq -r ".manifests[] | select(.platform.architecture == \"$ARCHITECTURE\" and .platform.variant == \"$VARIANT\") | .digest" < "$MANIFEST_FILE")
|
|
fi
|
|
|
|
echo "$HASH"
|
|
}
|
|
|
|
# get manifest
|
|
if [ ! -f "$MANIFEST_FILE" ]; then
|
|
docker pull "$IMAGE"
|
|
docker manifest inspect "$IMAGE" > "$MANIFEST_FILE"
|
|
fi
|
|
|
|
# main
|
|
for platform in "${PLATFORMS[@]}"; do
|
|
# split architecture.version
|
|
IFS='.' read -r ARCHITECTURE VARIANT <<< "$platform"
|
|
|
|
# add xargs to trim whitespace
|
|
RUNTIME_HASH=$(hash "$ARCHITECTURE" "$VARIANT")
|
|
|
|
# arm architectures flavors, strip "v" prefix
|
|
GOARM=${VARIANT:1}
|
|
|
|
# build for target runtime image and architecture
|
|
docker build --build-arg RUNTIME_HASH=@${RUNTIME_HASH} --build-arg GOARCH=${ARCHITECTURE} --build-arg GOARM=${GOARM} -t "$TAG:latest-$platform" .
|
|
done
|
|
|
|
# push images
|
|
for platform in "${PLATFORMS[@]}"; do
|
|
docker push "$TAG:latest-$platform"
|
|
done
|
|
|
|
# create manifest
|
|
TAG_LIST=$(printf "$TAG:latest-%s " "${PLATFORMS[@]}")
|
|
# shellcheck disable=SC2086
|
|
docker manifest create --amend "$TAG:latest" $TAG_LIST
|
|
|
|
for platform in "${PLATFORMS[@]}"; do
|
|
# split architecture.version
|
|
IFS='.' read -r ARCHITECTURE VARIANT <<< "$platform"
|
|
|
|
# docker and go architectures don't match
|
|
if [ "arm" == "$ARCHITECTURE" ] && [ -n "$VARIANT" ]; then
|
|
VARIANT="$ARCHITECTURE$VARIANT"
|
|
fi
|
|
|
|
docker manifest annotate "$TAG:latest" "$TAG:latest-$platform" --os "$OS" --arch "$ARCHITECTURE" --variant "$VARIANT"
|
|
done
|
|
|
|
docker manifest push "$TAG:latest"
|