From bd8b720a58a7584958574d4e807205c452b3beb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=B0=8F=E4=BA=91?= Date: Wed, 14 Jan 2026 12:56:12 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=95=9C=E5=83=8F=E6=89=93?= =?UTF-8?q?=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build-multiarch-image.sh | 121 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100755 build-multiarch-image.sh diff --git a/build-multiarch-image.sh b/build-multiarch-image.sh new file mode 100755 index 0000000..00b536d --- /dev/null +++ b/build-multiarch-image.sh @@ -0,0 +1,121 @@ +#!/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 "=========================================="