a-cloud-all/build-multiarch-image.sh

122 lines
3.5 KiB
Bash
Raw Permalink Normal View History

2026-01-14 12:56:12 +08:00
#!/bin/bash
# 多架构镜像构建脚本
# 用法: ./build-multiarch-image.sh <source_image> <target_registry>
# 示例: ./build-multiarch-image.sh mysql:8.0 registry.t-aaron.com
set -e
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
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
}
# 检查参数
if [ $# -lt 1 ]; then
error "用法: $0 <source_image> [target_registry]\n示例: $0 mysql:8.0\n示例: $0 mysql:8.0 registry.t-aaron.com"
fi
SOURCE_IMAGE=$1
TARGET_REGISTRY=${2:-"registry.t-aaron.com"}
# 从源镜像中提取镜像名和标签
if [[ $SOURCE_IMAGE == *":"* ]]; then
IMAGE_NAME=$(echo $SOURCE_IMAGE | cut -d':' -f1)
IMAGE_TAG=$(echo $SOURCE_IMAGE | cut -d':' -f2)
else
IMAGE_NAME=$SOURCE_IMAGE
IMAGE_TAG="latest"
SOURCE_IMAGE="${IMAGE_NAME}:${IMAGE_TAG}"
fi
# 构建目标镜像名称
TARGET_IMAGE="${TARGET_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}"
TARGET_IMAGE_ARM64="${TARGET_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}-arm64"
TARGET_IMAGE_AMD64="${TARGET_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}-amd64"
info "=========================================="
info "多架构镜像构建配置"
info "=========================================="
info "源镜像: ${SOURCE_IMAGE}"
info "目标镜像: ${TARGET_IMAGE}"
info "ARM64 镜像: ${TARGET_IMAGE_ARM64}"
info "AMD64 镜像: ${TARGET_IMAGE_AMD64}"
info "=========================================="
echo
# 步骤 1拉取 ARM64 架构的镜像
info "步骤 1/7: 拉取 ARM64 架构的镜像..."
docker pull --platform linux/arm64 ${SOURCE_IMAGE}
# 立即获取 ARM64 镜像的 Image ID
ARM64_IMAGE_ID=$(docker images --filter=reference=${SOURCE_IMAGE} --format "{{.ID}}" | head -1)
info "ARM64 镜像 ID: ${ARM64_IMAGE_ID}"
info "✓ ARM64 镜像拉取完成"
echo
# 步骤 2给 ARM64 镜像打标签并推送
info "步骤 2/7: 给 ARM64 镜像打标签并推送..."
docker tag ${ARM64_IMAGE_ID} ${TARGET_IMAGE_ARM64}
docker push ${TARGET_IMAGE_ARM64}
info "✓ ARM64 镜像推送完成"
echo
# 步骤 3拉取 AMD64 架构的镜像
info "步骤 3/7: 拉取 AMD64 架构的镜像..."
docker pull --platform linux/amd64 ${SOURCE_IMAGE}
# 立即获取 AMD64 镜像的 Image ID
AMD64_IMAGE_ID=$(docker images --filter=reference=${SOURCE_IMAGE} --format "{{.ID}}" | head -1)
info "AMD64 镜像 ID: ${AMD64_IMAGE_ID}"
info "✓ AMD64 镜像拉取完成"
echo
# 步骤 4给 AMD64 镜像打标签并推送
info "步骤 4/7: 给 AMD64 镜像打标签并推送..."
docker tag ${AMD64_IMAGE_ID} ${TARGET_IMAGE_AMD64}
docker push ${TARGET_IMAGE_AMD64}
info "✓ AMD64 镜像推送完成"
echo
# 步骤 5创建 multi-arch manifest
info "步骤 5/7: 创建 multi-arch manifest..."
docker buildx imagetools create -t ${TARGET_IMAGE} \
${TARGET_IMAGE_ARM64} \
${TARGET_IMAGE_AMD64}
info "✓ Multi-arch manifest 创建完成"
echo
# 步骤 6验证 multi-arch 镜像
info "步骤 6/7: 验证 multi-arch 镜像..."
docker buildx imagetools inspect ${TARGET_IMAGE}
echo
# 步骤 7完成
info "=========================================="
info "步骤 7/7: 构建完成!"
info "=========================================="
info "多架构镜像已成功创建: ${TARGET_IMAGE}"
info ""
info "使用方法:"
info " docker pull ${TARGET_IMAGE}"
info ""
info "该镜像支持以下架构:"
info " - linux/arm64 (Image ID: ${ARM64_IMAGE_ID})"
info " - linux/amd64 (Image ID: ${AMD64_IMAGE_ID})"
info "=========================================="