257 lines
5.8 KiB
Bash
Executable File
257 lines
5.8 KiB
Bash
Executable File
#!/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 "==========================================" |