添加镜像打包
This commit is contained in:
parent
ffd000b40b
commit
bd8b720a58
|
|
@ -0,0 +1,121 @@
|
|||
#!/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 "=========================================="
|
||||
Loading…
Reference in New Issue