修改打包部署脚本

This commit is contained in:
孙小云 2026-01-14 16:27:35 +08:00
parent adda4f64e3
commit d6efa9ce0f
2 changed files with 259 additions and 2 deletions

View File

@ -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 "=========================================="

View File

@ -1,4 +1,4 @@
FROM ubuntu:20.04 AS build FROM registry.t-aaron.com/ubuntu:20.04 AS build
ARG MODEL ARG MODEL
#shell,rtmp,rtsp,rtsps,http,https,rtp #shell,rtmp,rtsp,rtsps,http,https,rtp
EXPOSE 1935/tcp 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 .. && \ RUN cmake -DCMAKE_BUILD_TYPE=${MODEL} -DENABLE_WEBRTC=true -DENABLE_FFMPEG=true -DENABLE_TESTS=false -DENABLE_API=false .. && \
make -j $(nproc) make -j $(nproc)
FROM ubuntu:20.04 FROM registry.t-aaron.com/ubuntu:20.04
ARG MODEL ARG MODEL
# ADD sources.list /etc/apt/sources.list # ADD sources.list /etc/apt/sources.list