#!/usr/bin/env bash set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" VENDOR="" BASE_IMAGE="" REGISTRY="unis" IMAGE_NAME="qwen3-asr" VERSION="$(date +"%Y%m%d_%H%M%S")" OUTPUT_DIR="${ROOT_DIR}/build-file" EXPORT_TAR="true" NO_CACHE="false" PYTHON_BIN="" usage() { cat <&2; exit 1; } info() { echo "[INFO] $1" >&2; } compressor() { command -v pigz >/dev/null 2>&1 && echo "pigz -f" || echo "gzip -f"; } while [[ $# -gt 0 ]]; do case "$1" in --vendor) VENDOR="$2"; shift 2 ;; --base-image) BASE_IMAGE="$2"; shift 2 ;; -v|--version) VERSION="$2"; shift 2 ;; -r|--registry) REGISTRY="$2"; shift 2 ;; -o|--output) OUTPUT_DIR="$2"; shift 2 ;; --python-bin) PYTHON_BIN="$2"; shift 2 ;; --no-export) EXPORT_TAR="false"; shift ;; --no-cache) NO_CACHE="true"; shift ;; -h|--help) usage; exit 0 ;; *) die "Unknown argument: $1" ;; esac done [[ -n "$VENDOR" ]] || die "--vendor is required" [[ -n "$BASE_IMAGE" ]] || die "--base-image is required" case "$VENDOR" in metax) dockerfile="Dockerfile.metax" tag="${REGISTRY}/${IMAGE_NAME}:metax-${VERSION}" target="metax" build_arg_name="METAX_BASE_IMAGE" default_python_bin="/opt/conda/bin/python" ;; iluvatar|ix|tianshu) dockerfile="Dockerfile.iluvatar" tag="${REGISTRY}/${IMAGE_NAME}:iluvatar-${VERSION}" target="iluvatar" build_arg_name="ILUVATAR_BASE_IMAGE" default_python_bin="python3" ;; mthreads|musa|moorethreads) dockerfile="Dockerfile.mthreads" tag="${REGISTRY}/${IMAGE_NAME}:mthreads-${VERSION}" target="mthreads" build_arg_name="MTHREADS_BASE_IMAGE" default_python_bin="python3" ;; *) die "Unsupported vendor: ${VENDOR}" ;; esac PYTHON_BIN="${PYTHON_BIN:-$default_python_bin}" docker image inspect "$BASE_IMAGE" >/dev/null 2>&1 || { die "Base image not found locally: ${BASE_IMAGE}. Run docker load first or docker pull it." } args=( build -f "$dockerfile" -t "$tag" --build-arg "${build_arg_name}=${BASE_IMAGE}" --build-arg "PYTHON_BIN=${PYTHON_BIN}" ) [[ "$NO_CACHE" == "true" ]] && args+=(--no-cache) info "Building fused image: ${tag}" info "Vendor base image: ${BASE_IMAGE}" info "Base image Python: ${PYTHON_BIN}" ( cd "$ROOT_DIR" docker "${args[@]}" . ) if [[ "$EXPORT_TAR" == "true" ]]; then mkdir -p "$OUTPUT_DIR" tar_path="${OUTPUT_DIR}/${IMAGE_NAME}-${target}-${VERSION}-amd64.tar" info "Exporting image archive: ${tar_path}" docker save -o "$tar_path" "$tag" info "Compressing archive" $(compressor) "$tar_path" info "Done: ${tar_path}.gz" else info "Built image: ${tag}" fi