From 1e5110b8c6da17f7ae11864c0da6fee179a4122d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miroslav=20=C5=A0ediv=C3=BD?= Date: Fri, 28 Mar 2025 16:07:14 +0100 Subject: [PATCH] add support for multiple tags and push. --- build | 72 +++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 60 insertions(+), 12 deletions(-) diff --git a/build b/build index 57a05534..49db25b4 100755 --- a/build +++ b/build @@ -14,12 +14,13 @@ function help() { echo "Usage: $0" echo " -p, --platform : The platform (default: linux/amd64)" echo " -i, --image : The image name prefix (default: ghcr.io/m1k1o/neko)" - echo " -v, --version : The version (default: latest)" + echo " -t, --tag : The image tag (default: latest)" echo " -f, --flavor : The flavor, if not specified, builds without flavor" - echo " -b, --base : The base image name (default: ghcr.io/m1k1o/neko/[-]base:)" + echo " -b, --base : The base image name (default: ghcr.io/m1k1o/neko/[-]base:)" echo " -a, --app : The app to build, if not specified, builds the base image" echo " -y, --yes : Skip confirmation prompts" echo " --no-cache : Build without docker cache" + echo " --push : Push the image to the registry after building" echo " -h, --help : Show this help message" } @@ -28,31 +29,37 @@ while [[ "$#" -gt 0 ]]; do case $1 in --platform|-p) PLATFORM="$2"; shift ;; --image|-i) IMAGE="$2"; shift ;; - --version|-v) VERSION="$2"; shift ;; + --tag|-t) + # comma separated list of TAGS + IFS=',' read -r -a TAGS <<< "$2" + # default tag is the first one + TAG="${TAGS[0]}" + shift ;; --flavor|-f) FLAVOR="$2"; shift ;; --base|-b) BASE_IMAGE="$2"; shift ;; --app|-a) APPLICATION="$2"; shift ;; --yes|-y) YES=1 ;; --no-cache) NO_CACHE="--no-cache" log "Building without cache" ;; + --push) PUSH=1 ;; --help|-h) help; exit 0 ;; -*) log "Unknown parameter passed: $1"; help; exit 1 ;; *) if [ -z "$FULL_IMAGE" ]; then FULL_IMAGE="$1" - # extracts image, flavor, app and version from the full image name + # extracts image, flavor, app and tag from the full image name # example: # ghcr.io/m1k1o/neko/nvidia-firefox:latest # will be split into: # IMAGE=ghcr.io/m1k1o/neko # FLAVOR=nvidia # APPLICATION=firefox - # VERSION=latest + # TAG=latest # remove the tag from the image name if [[ "$FULL_IMAGE" == *":"* ]]; then # removes everything before the last : - VERSION="${FULL_IMAGE##*:}" # will be latest + TAG="${FULL_IMAGE##*:}" # will be latest # removes everything after the last : FULL_IMAGE="${FULL_IMAGE%:*}" # will be ghcr.io/m1k1o/neko/nvidia-firefox fi @@ -114,6 +121,36 @@ function build_image() { docker build --platform $PLATFORM $NO_CACHE $@ } +function tag_image() { + local IMAGE="$1" + local IMAGE_NO_TAG="${IMAGE%:*}" + local IMAGE_TAG="${IMAGE##*:}" + + for TAG in "${TAGS[@]}"; do + # skip if the tag is the same as the image tag + if [ "$TAG" == "$IMAGE_TAG" ]; then + continue + fi + + log "Tagging $IMAGE with tag $TAG" + docker tag $IMAGE $IMAGE_NO_TAG:$TAG + done +} + +function push_image() { + if [ -z "$PUSH" ]; then + return 0 + fi + + local IMAGE="$1" + local IMAGE_NO_TAG="${IMAGE%:*}" + + for TAG in "${TAGS[@]}"; do + log "Pushing $IMAGE_NO_TAG:$TAG to registry" + docker push $IMAGE_NO_TAG:$TAG + done +} + # -------------------------------------------------------------------- if [ -z "$PLATFORM" ]; then @@ -126,10 +163,14 @@ if [ -z "$IMAGE" ]; then fi log "Using image: $IMAGE" -if [ -z "$VERSION" ]; then - VERSION="latest" +if [ -z "$TAG" ]; then + TAG="latest" + TAGS=($TAG) fi -log "Using version: $VERSION" + +for TAG in "${TAGS[@]}"; do + log "Using tag: $TAG" +done if [ -z "$FLAVOR" ]; then log "No flavor specified, building without flavor" @@ -139,9 +180,9 @@ fi if [ -z "$BASE_IMAGE" ]; then if [ -z "$FLAVOR" ]; then - BASE_IMAGE="$IMAGE/base:$VERSION" + BASE_IMAGE="$IMAGE/base:$TAG" else - BASE_IMAGE="$IMAGE/$FLAVOR-base:$VERSION" + BASE_IMAGE="$IMAGE/$FLAVOR-base:$TAG" fi fi @@ -159,7 +200,7 @@ if [ ! -z "$APPLICATION" ]; then fi # flavor is specified, append it to the image name and Dockerfile - APPLICATION_IMAGE="$IMAGE/$APPLICATION:$VERSION" + APPLICATION_IMAGE="$IMAGE/$APPLICATION:$TAG" APPLICATION_DOCKERFILE="apps/$APPLICATION/Dockerfile" if [ ! -z "$FLAVOR" ]; then APPLICATION_IMAGE="$IMAGE/$FLAVOR-$APPLICATION" @@ -177,6 +218,10 @@ if [ ! -z "$APPLICATION" ]; then -t $APPLICATION_IMAGE \ -f $APPLICATION_DOCKERFILE \ $APPLICATION_DIR + + tag_image $APPLICATION_IMAGE + push_image $APPLICATION_IMAGE + exit 0 fi @@ -220,3 +265,6 @@ build_image -t $BASE_IMAGE -f - . <