#!/bin/bash # ZLMediaKit 多架构 Docker 镜像构建脚本(兼容原版参数) # 用法: ./build_docker_multiarch.sh [-t build|push] [-p amd64|arm64|multi] [-m Debug|Release] [-v version] [-r registry] # 示例: ./build_docker_multiarch.sh -t build -p multi -m Release -v latest -r registry.t-aaron.com # 示例: ./build_docker_multiarch.sh -t build -p amd64 -m Debug -v v1.0.0 set -e # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 打印带颜色的信息 info() { echo -e "${GREEN}[INFO]${NC} $1" } warn() { echo -e "${YELLOW}[WARN]${NC} $1" } error() { echo -e "${RED}[ERROR]${NC} $1" exit 1 } # 默认值 type="" version="" platform="" model="" registry="registry.t-aaron.com" # 解析命令行参数 while getopts "t:p:m:v:r:" opt do case $opt in t) type=$OPTARG ;; v) version=$OPTARG ;; p) platform=$OPTARG ;; m) model=$OPTARG ;; r) registry=$OPTARG ;; ?) error "未知参数" exit ;; esac done # 帮助信息 help_string="用法: $0 [-t build|push] [-p amd64|arm64|multi] [-m Debug|Release] [-v version] [-r registry]\n示例: $0 -t build -p multi -m Release -v latest\n示例: $0 -t build -p amd64 -m Debug -v v1.0.0" # 验证必要参数 if [[ ! -n $type ]];then echo $help_string exit fi if [[ ! -n $model ]];then echo $help_string exit fi if [[ ! -n $version ]];then echo "使用 latest,未设置版本" version="latest" fi if [[ ! -n $platform ]];then platform=`arch` info "自动选择架构: ${platform}" fi # 架构转换 case $platform in "arm64") platform="linux/arm64" PLATFORMS="linux/arm64" ;; "x86_64"|"amd64") platform="linux/amd64" PLATFORMS="linux/amd64" ;; "multi") platform="linux/multiarch" PLATFORMS="linux/arm64,linux/amd64" ;; *) error "未知架构 ${platform}\n使用 'docker buildx ls' 查看支持的架构" exit ;; esac # 构建模式验证 case $model in 'Debug') ;; 'Release') ;; *) error "未知构建模式" echo $help_string exit ;; esac # 项目配置 namespace="zlmediakit" packagename="zlmediakit" image_name="${registry}/${namespace}/${packagename}" target_image="${image_name}:${model}.${version}" # 显示配置信息 info "==========================================" info "ZLMediaKit 多架构 Docker 镜像构建" info "==========================================" info "操作类型: $type" info "架构平台: $PLATFORMS" info "构建模式: $model" info "镜像版本: $version" info "目标仓库: $registry" info "镜像名称: $target_image" info "==========================================" echo # 检查 Docker buildx(多架构构建需要) if [[ $PLATFORMS == *","* ]]; then info "检查 Docker buildx..." if ! docker buildx version >/dev/null 2>&1; then error "多架构构建需要 Docker buildx,请确保 Docker 版本 >= 20.10" fi # 创建或使用现有的 buildx builder BUILDER_NAME="zlm-multiarch" if ! docker buildx ls | grep -q "$BUILDER_NAME"; then info "创建 buildx builder: $BUILDER_NAME" docker buildx create --name "$BUILDER_NAME" --use --bootstrap else info "使用现有 buildx builder: $BUILDER_NAME" docker buildx use "$BUILDER_NAME" fi fi # 执行操作 case $type in 'build') # 清理旧的构建缓存 rm -rf ../build/CMakeCache.txt 2>/dev/null || true info "开始构建 Docker 镜像..." if [[ $PLATFORMS == *","* ]]; then # 多架构构建 info "构建多架构镜像: $PLATFORMS" # 构建并推送各架构镜像 for arch in linux/arm64 linux/amd64; do arch_tag=$(echo $arch | sed 's/linux\///') arch_image="${image_name}:${model}.${version}-${arch_tag}" info "构建 $arch 架构镜像: $arch_image" docker buildx build \ --platform=$arch \ --network=host \ --build-arg MODEL=$model \ --build-arg VERSION=$version \ --tag $arch_image \ --push \ --file ../dockerfile \ .. done # 创建 multi-arch manifest info "创建多架构 manifest..." arm64_image="${image_name}:${model}.${version}-arm64" amd64_image="${image_name}:${model}.${version}-amd64" docker buildx imagetools create -t $target_image \ $arm64_image \ $amd64_image info "✓ 多架构镜像创建完成: $target_image" # 验证多架构镜像 info "验证多架构镜像..." docker buildx imagetools inspect $target_image else # 单架构构建 info "构建单架构镜像: $PLATFORMS" docker buildx build \ --platform=$PLATFORMS \ --network=host \ --build-arg MODEL=$model \ --build-arg VERSION=$version \ --tag $target_image \ --load \ --file ../dockerfile \ .. info "✓ 单架构镜像构建完成: $target_image" fi ;; 'push') if [[ $PLATFORMS == *","* ]]; then warn "多架构镜像已在构建时推送,此操作将推送统一 manifest" info "推送多架构 manifest..." docker buildx imagetools create -t $target_image \ ${image_name}:${model}.${version}-arm64 \ ${image_name}:${model}.${version}-amd64 else info "推送到目标仓库: $registry" info "注意: 如果推送到私有仓库,请先登录: docker login $registry" docker push $target_image fi info "✓ 镜像推送完成: $target_image" ;; *) error "未知操作类型" echo $help_string exit ;; esac echo info "==========================================" info "操作完成!" info "==========================================" info "镜像信息: $target_image" if [[ $PLATFORMS == *","* ]]; then info "支持架构: linux/arm64, linux/amd64" info "" info "使用方法:" info " docker pull $target_image" info "" info "验证方法:" info " docker buildx imagetools inspect $target_image" else info "架构: $PLATFORMS" info "" info "使用方法:" info " docker pull $target_image" fi info "=========================================="