11#! /usr/bin/env bash
2- set -e
2+ set -e -o pipefail
33
44BUILD_ARGUMENTS=()
5- DEPENDENCIES=(docker)
5+ BUILDER_EXPORT_ARCHIVE=" ${BUILDER_EXPORT_ARCHIVE:- true} "
6+ DEPENDENCIES=(docker zstd)
67UPDATE_BASE=false
7- PLATFORMS=(amd64 arm64)
8- REGISTRY_USER=" madebytimo"
8+ PLATFORMS=(linux/amd64 linux/arm64)
9+ REGISTRY=" docker.io/madebytimo"
10+ SCRIPT_DIR=" $( dirname " $( realpath " $0 " ) " ) "
911APPLICATION_NAME=" monerod"
1012
1113# help message
@@ -14,7 +16,7 @@ for ARGUMENT in "$@"; do
1416 echo " usage: $( basename " $0 " ) [ARGUMENT]"
1517 echo " Builds the docker image from the Dockerfile."
1618 echo " ARGUMENT can be"
17- echo " --platform [amd64|arm64|arm] Build only for specified platform."
19+ echo " --platform PLATFORM Build only for specified platform."
1820 echo " --publish Push the build."
1921 echo " --update-base Only build if newer base image is available."
2022 exit
@@ -42,32 +44,53 @@ while [[ -n "$1" ]]; do
4244 shift
4345done
4446
47+ IMAGE=" ${REGISTRY} /${APPLICATION_NAME} "
4548PROJECT_DIR=" $( dirname " $SCRIPT_DIR " ) "
4649VERSION=" $( cat Version.txt) "
4750
4851cd " $PROJECT_DIR "
4952mkdir --parents builds
5053
51- BASE_IMAGE=" $( tac Dockerfile | grep --max-count=1 " ^FROM" | cut -d" " -f2) "
52- docker pull " $BASE_IMAGE "
53- BASE_IMAGE_DATE=" $( docker image inspect --format=" {{ .Created }}" " $BASE_IMAGE " | cut -d " T" -f1) "
54- echo " Base image is $BASE_IMAGE from $BASE_IMAGE_DATE "
55- IMAGE=" ${REGISTRY_USER} /${APPLICATION_NAME} "
5654if [[ " $UPDATE_BASE " == true ]]; then
55+ BASE_IMAGE=" $( tac Dockerfile | grep --max-count=1 " ^FROM" | cut -d" " -f2) "
56+ docker pull --quiet " $BASE_IMAGE "
57+ BASE_IMAGE_DATE=" $( docker image inspect --format=" {{ .Created }}" " $BASE_IMAGE " \
58+ | sed ' s|^\([^T ]*\)[T ].*$|\1|' ) "
59+ echo " Base image is $BASE_IMAGE from $BASE_IMAGE_DATE "
5760 docker pull " $IMAGE "
58- PUSHED_IMAGE_DATE=" $( docker image inspect --format=" {{ .Created }}" " $IMAGE " | cut -d " T" -f1) "
61+ PUSHED_IMAGE_DATE=" $( docker image inspect --format=" {{ .Created }}" " $IMAGE " \
62+ | sed ' s|^\([^T ]*\)[T ].*$|\1|' ) "
5963 echo " Last pushed image is from $PUSHED_IMAGE_DATE "
6064 if [[ " $BASE_IMAGE_DATE " < " $PUSHED_IMAGE_DATE " ]]; then
6165 echo " Used base image is up to date"
6266 exit ;
6367 fi
68+ docker image rm " $IMAGE "
6469fi
6570
6671PLATFORMS_STRING=" ${PLATFORMS[*]} "
6772BUILD_ARGUMENTS+=(--platform " ${PLATFORMS_STRING// / ,} " )
68- OUTPUT_FILE=" builds/${IMAGE// " /" / -} -${VERSION} -oci.tar"
73+ if [[ " $BUILDER_EXPORT_ARCHIVE " == true ]]; then
74+ OUTPUT_FILE=" builds/$( basename " $REGISTRY " ) -${APPLICATION_NAME} -${VERSION} -oci.tar"
75+ BUILD_ARGUMENTS+=(--output \
76+ " type=oci,dest=${OUTPUT_FILE} ,compression=zstd,compression-level=19,force-compression=true" )
77+ fi
6978
70- docker buildx build " ${BUILD_ARGUMENTS[@]} " --output \
71- " type=oci,dest=${OUTPUT_FILE} ,compression=zstd,compression-level=19,force-compression=true" \
79+ docker buildx build --pull " ${BUILD_ARGUMENTS[@]} " \
7280 --tag " ${IMAGE} :latest" --tag " ${IMAGE} :${VERSION} " \
73- --tag " ${IMAGE} :${VERSION} -base-${BASE_IMAGE_DATE} " .
81+ --tag " ${IMAGE} :${VERSION} -$( date " +%Y.%m.%d" ) " .
82+
83+ if [[ " $BUILDER_EXPORT_ARCHIVE " == true ]]; then
84+ docker pull --quiet quay.io/skopeo/stable > /dev/null
85+ rm -f builds/.temp-docker-archive.tar
86+ for PLATFORM in " ${PLATFORMS[@]} " ; do
87+ docker run --interactive --network none --rm --volume " ${PWD} /builds:/builds" \
88+ quay.io/skopeo/stable copy --additional-tag " ${IMAGE} :latest" --additional-tag \
89+ " ${IMAGE} :${VERSION} " --additional-tag " ${IMAGE} :${VERSION} -$( date " +%Y.%m.%d" ) " \
90+ --override-arch " ${PLATFORM#*/ } " --quiet " oci-archive:${OUTPUT_FILE} :latest" \
91+ " docker-archive:builds/.temp-docker-archive.tar"
92+ zstd -19 --force --quiet -T0 builds/.temp-docker-archive.tar \
93+ -o " ${OUTPUT_FILE% oci.tar}${PLATFORM#*/ } .tar.zst"
94+ rm -f builds/.temp-docker-archive.tar
95+ done
96+ fi
0 commit comments