#!/bin/bash # 多架构镜像构建脚本 # 用法: ./build-multiarch-image.sh # 示例: ./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 [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 "=========================================="