#!/bin/bash # makedist-docker - push rootfs images to docker hub # Copyright (c) 2024 by Silvan Calarco # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. makedist_me="${0##*/}" copyleft="\ makedist-docker - push rootfs images to docker hub Copyright (c) 2024 by Silvan Calarco " echo "$copyleft" function usage() { echo "\ usage: $makedist_me target language Example: $makedist_me rootfs-base en " >&2 } TARGET=$1 LANGUAGE=$2 [ "${TARGET}" -a "${LANGUAGE}" ] || { usage exit 1 } . /etc/sysconfig/makedist BASEDIR=${REPODIR_LOCAL}/media/rolling/${TARGET}/${LANGUAGE} [ "${DOCKER_USER}" -a "${DOCKER_TOKEN}" ] || { echo "ERROR: missing docker credentials; exiting." exit 1 } [ "${DOCKER_REPOSITORY}" ] || { echo "ERROR: missing DOCKER_REPOSITORY declaration; exiting." exit 1 } create_and_push_manifest() { local MANIFEST_TAG="$1" local MANIFESTS_LIST="$2" local SNAPSHOT_VERSION="$3" local PLATFORM docker manifest rm ${MANIFEST_TAG} docker manifest create ${MANIFEST_TAG} ${MANIFESTS_LIST} for ARCH in x86_64 aarch64 i586; do if [ "${ARCH}" == "aarch64" ]; then PLATFORM="arm64" elif [ "${ARCH}" == "x86_64" ]; then PLATFORM="amd64" elif [ "${ARCH}" == "i586" ]; then PLATFORM="386" fi docker manifest annotate ${MANIFEST_TAG} \ ${DOCKER_REPOSITORY}:snapshot-${SNAPSHOT_VERSION}-${ARCH} \ --os linux --arch ${PLATFORM} done echo "Pushing manifest with tag ${MANIFEST_TAG}..." docker manifest push ${MANIFEST_TAG} } docker login -u ${DOCKER_USER} -p ${DOCKER_TOKEN} MANIFESTS_LIST="" for ARCH in x86_64 aarch64 i586; do if [ "${ARCH}" == "aarch64" ]; then PLATFORM="linux/arm64" elif [ "${ARCH}" == "x86_64" ]; then PLATFORM="linux/amd64" elif [ "${ARCH}" == "i586" ]; then PLATFORM="linux/386" fi ROOTFS_ARCHIVE=`readlink -f ${BASEDIR}/openmamba-${TARGET}-${LANGUAGE}-snapshot.${ARCH}.tar.xz` SNAPSHOT_VERSION=`echo ${ROOTFS_ARCHIVE} | sed "s|.*snapshot-\([0-9]*\).*|\1|"` if [ "$SNAPSHOT_VERSION" == "" ]; then echo "ERROR: unable to find snapshot version from ${ROOTFS_ARCHIVE}; skipping ${ARCH}..." continue fi IMAGE_TAG="snapshot-${SNAPSHOT_VERSION}-${ARCH}" if [ -z "$(docker images -q ${DOCKER_REPOSITORY}:${IMAGE_TAG} 2>/dev/null)" ]; then echo "Importing `basename ${ROOTFS_ARCHIVE}` (arch:${ARCH};version:${SNAPSHOT_VERSION})..." xzcat ${ROOTFS_ARCHIVE} | docker import --platform ${PLATFORM} - ${DOCKER_REPOSITORY}:${IMAGE_TAG} || exit 1 else echo "Image ${DOCKER_REPOSITORY}:${IMAGE_TAG} already exists locally" fi docker push ${DOCKER_REPOSITORY}:snapshot-${SNAPSHOT_VERSION}-${ARCH} MANIFESTS_LIST="${MANIFESTS_LIST} ${DOCKER_REPOSITORY}:snapshot-${SNAPSHOT_VERSION}-${ARCH}" done # Prepare multiplatform manifest create_and_push_manifest ${DOCKER_REPOSITORY}:snapshot-${SNAPSHOT_VERSION} "${MANIFESTS_LIST}" ${SNAPSHOT_VERSION} create_and_push_manifest ${DOCKER_REPOSITORY}:latest "${MANIFESTS_LIST}" ${SNAPSHOT_VERSION}