From 121b2d4ee452caa2ad26199bdd1123be5a558bbe Mon Sep 17 00:00:00 2001 From: Jian Qiu Date: Tue, 31 Mar 2026 17:42:20 +0800 Subject: [PATCH] fix: support build specific multi-arch buildx (#24587) Co-authored-by: Qiu Jian --- scripts/docker_push.sh | 82 +++++++++++++++--------------------------- 1 file changed, 29 insertions(+), 53 deletions(-) diff --git a/scripts/docker_push.sh b/scripts/docker_push.sh index c14c9e1dfa..13b5f301e6 100755 --- a/scripts/docker_push.sh +++ b/scripts/docker_push.sh @@ -43,6 +43,8 @@ get_current_arch() { echo $current_arch } +ALLARCH=("amd64" "arm64" "riscv64") + pushd $( cd "$(dirname "$0")" pwd @@ -137,12 +139,13 @@ buildx_and_push() { docker pull --platform "linux/$arch" "$tag" } + get_image_name() { local component=$1 local arch=$2 local is_all_arch=$3 local img_name="$REGISTRY/$component:$TAG" - if [[ "$is_all_arch" == "true" || "$arch" == arm64 || "$arch" == riscv64 ]]; then + if [[ -n "$arch" && "$is_all_arch" == "true" ]]; then img_name="${img_name}-$arch" fi echo $img_name @@ -214,39 +217,22 @@ general_build() { fi } -make_manifest_image2() { - local component=$1 - local img_name=$(get_image_name $component "" "false") - if [[ "$DRY_RUN" == "true" ]]; then - echo "[$(readlink -f ${BASH_SOURCE}):${LINENO} ${FUNCNAME[0]}] return for DRY_RUN" - return - fi - docker buildx imagetools create -t $img_name \ - $img_name-amd64 \ - $img_name-arm64 -} - make_manifest_image() { local component=$1 + local arch=$2 local img_name=$(get_image_name $component "" "false") if [[ "$DRY_RUN" == "true" ]]; then echo "[$(readlink -f ${BASH_SOURCE}):${LINENO} ${FUNCNAME[0]}] return for DRY_RUN" return fi - - if [[ "$img_name" == *:5000/* ]]; then - docker push $img_name-amd64 - docker push $img_name-arm64 - docker push $img_name-riscv64 - fi - - docker buildx imagetools create -t $img_name \ - $img_name-amd64 \ - $img_name-arm64 \ - $img_name-riscv64 - docker manifest inspect ${img_name} | grep -wq amd64 - docker manifest inspect ${img_name} | grep -wq arm64 - docker manifest inspect ${img_name} | grep -wq riscv64 + CMD="docker buildx imagetools create -t ${img_name} " + for ac in "${ALLARCH[@]}"; do + if [[ "${arch}" == "all" || "${arch}" == *"$ac"* ]]; then + CMD="${CMD} ${img_name}-${ac}" + fi + done + echo "$CMD" + $CMD } ALL_COMPONENTS=$(ls cmd | grep -v '.*cli$' | xargs) @@ -268,13 +254,9 @@ mkdir -p $SRC_DIR/_output show_update_cmd() { local component=$1 - local arch=$2 local spec=$1 local name=$1 - local tag=${TAG} - if [[ "$arch" == arm64 || "$arch" == riscv64 ]]; then - tag="${tag}-$arch" - fi + local tag=$TAG case "$component" in 'apigateway') @@ -327,33 +309,27 @@ for component in $COMPONENTS; do echo "Start to build component: $component" - case "$ARCH" in - all) - if [[ $component == "baremetal-agent" ]]; then - for arch in "arm64" "amd64"; do - general_build $component $arch "true" - done - make_manifest_image2 $component - else - for arch in "arm64" "amd64" "riscv64"; do - general_build $component $arch "true" - done - make_manifest_image $component + multiarch="" + for ac in "${ALLARCH[@]}"; do + if [[ "$ARCH" == "$ac" ]]; then + # single arch + if [ -e "$DOCKER_DIR/Dockerfile.$component" ]; then + general_build $component $ARCH "false" + fi + elif [[ "$ARCH" == "all" || "$ARCH" == *"$ac"* ]]; then + multiarch="true" + general_build $component $ac "true" fi - ;; - *) - if [ -e "$DOCKER_DIR/Dockerfile.$component" ]; then - general_build $component $ARCH "false" - fi - ;; - esac + done + if [[ "$multiarch" == "true" ]]; then + make_manifest_image $component $ARCH + fi done echo "" - for component in $COMPONENTS; do if [[ $component == *cli ]]; then continue fi - show_update_cmd $component $ARCH + show_update_cmd $component done