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

122 lines
3.5 KiB
Bash
Executable File
Raw Permalink 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
# 多架构镜像构建脚本
# 用法: ./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 "=========================================="