From d6efa9ce0fc2febc77a303b679a6ee1983ad74ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=B0=8F=E4=BA=91?= Date: Wed, 14 Jan 2026 16:27:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=89=93=E5=8C=85=E9=83=A8?= =?UTF-8?q?=E7=BD=B2=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build-multi/build_docker_multiarch.sh | 257 ++++++++++++++++++++++++++ dockerfile | 4 +- 2 files changed, 259 insertions(+), 2 deletions(-) create mode 100755 build-multi/build_docker_multiarch.sh diff --git a/build-multi/build_docker_multiarch.sh b/build-multi/build_docker_multiarch.sh new file mode 100755 index 0000000..75e4402 --- /dev/null +++ b/build-multi/build_docker_multiarch.sh @@ -0,0 +1,257 @@ +#!/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 "==========================================" \ No newline at end of file diff --git a/dockerfile b/dockerfile index a3e877e..638e593 100644 --- a/dockerfile +++ b/dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:20.04 AS build +FROM registry.t-aaron.com/ubuntu:20.04 AS build ARG MODEL #shell,rtmp,rtsp,rtsps,http,https,rtp EXPOSE 1935/tcp @@ -50,7 +50,7 @@ WORKDIR /opt/media/ZLMediaKit/build RUN cmake -DCMAKE_BUILD_TYPE=${MODEL} -DENABLE_WEBRTC=true -DENABLE_FFMPEG=true -DENABLE_TESTS=false -DENABLE_API=false .. && \ make -j $(nproc) -FROM ubuntu:20.04 +FROM registry.t-aaron.com/ubuntu:20.04 ARG MODEL # ADD sources.list /etc/apt/sources.list