a-zlm/build-multi/build_docker_multiarch.sh

257 lines
5.8 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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 "=========================================="