chinaport-data-signature/chinaport-data-signature-webapp/docker_build_push_multiarch.sh
2026-03-02 17:31:56 +08:00

148 lines
4.4 KiB
Bash
Executable file
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.

#!/usr/bin/env zsh
# 检查并安装 sptn 命令
source ~/.zshrc
if command -v setproxy >/dev/null 2>&1; then
echo "检测到 setproxy 命令,正在执行..."
setproxy
else
echo "未检测到 setproxy 命令,跳过执行"
fi
export JAVA_HOME=$(/usr/libexec/java_home -v 17)
export PATH="$JAVA_HOME/bin:$PATH"
echo "当前 JDK 版本: $(java -version 2>&1 | head -1)"
# --- 进入项目目录 ---
cd ..
SETTINGS="/Users/${USER}/Development/program/apache-maven/conf/settings-aliyun.xml"
mvn clean package --settings $SETTINGS
cd chinaport-data-signature-webapp
# --- 配置信息 ---
TAG="1.2.1"
IMAGE="weasleyj/chinaport-data-signature"
CONTAINER_NAME="chinaport-data-signature"
BUILDER_NAME="multiarch-builder"
DOCKERFILE_PATH="./Dockerfile"
# --- 彩色输出 ---
readonly RED='\033[0;31m'
readonly GREEN='\033[0;32m'
readonly YELLOW='\033[1;33m'
readonly BLUE='\033[0;34m'
readonly NC='\033[0m'
# --- 日志函数 ---
log_info() { echo -e "${BLUE} $1${NC}"; }
log_warn() { echo -e "${YELLOW}⚠️ $1${NC}"; }
log_success() { echo -e "${GREEN}$1${NC}"; }
log_error() { echo -e "${RED}$1${NC}"; }
# --- 错误处理 ---
set -e
trap 'log_error "脚本执行失败,请检查错误信息"; exit 1' ERR
# --- 显示配置 ---
echo -e "${BLUE}🚀 开始多架构Docker镜像构建...${NC}"
echo -e "${BLUE} 镜像: ${IMAGE}${NC}"
echo -e "${BLUE} 标签: ${TAG}, latest${NC}"
echo -e "${BLUE} 平台: linux/amd64, linux/arm64${NC}"
echo ""
# [1] 检查前置条件
log_info "检查Docker环境..."
if ! docker info &>/dev/null; then
log_error "Docker未启动或不可用请先启动 Docker Desktop 后再运行本脚本!"
exit 1
fi
if ! docker buildx version &>/dev/null; then
log_error "Docker buildx 不可用请确认Docker版本支持buildx功能"
exit 1
fi
if [[ ! -f "$DOCKERFILE_PATH" ]]; then
log_error "Dockerfile不存在: $DOCKERFILE_PATH"
exit 1
fi
log_success "Docker环境检查通过"
# [2] 清理旧容器
if docker ps -a --format '{{.Names}}' | grep -wq "$CONTAINER_NAME"; then
log_info "清理旧容器: $CONTAINER_NAME"
docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker rm -f "$CONTAINER_NAME" 2>/dev/null || true
log_success "旧容器清理完成"
fi
# [3] Docker Hub 登录检查
log_info "检查Docker Hub登录状态..."
if ! docker system info --format '{{.RegistryConfig.IndexConfigs}}' 2>/dev/null | grep -q "weasleyj"; then
log_warn "未检测到登录状态,准备登录 Docker Hub..."
echo -e "${YELLOW}💡 建议使用 Personal Access Token 作为密码${NC}"
echo -e "${YELLOW} 创建Token: https://hub.docker.com/settings/security${NC}"
if ! docker login -u weasleyj; then
log_error "Docker Hub 登录失败!"
exit 1
fi
log_success "Docker Hub 登录成功"
else
log_success "已登录 Docker Hub"
fi
# [4] 设置多架构构建器
log_info "配置多架构构建器..."
if docker buildx ls | grep -q "$BUILDER_NAME"; then
log_info "使用现有构建器: $BUILDER_NAME"
docker buildx use "$BUILDER_NAME"
else
log_info "创建新的构建器: $BUILDER_NAME"
docker buildx create --name "$BUILDER_NAME" --driver docker-container --use --bootstrap
fi
# 检查构建器支持的平台
log_info "验证构建器平台支持..."
if ! docker buildx inspect --bootstrap | grep -E "(linux/amd64|linux/arm64)" &>/dev/null; then
log_error "构建器不支持所需平台 (linux/amd64, linux/arm64)"
exit 1
fi
log_success "构建器平台支持验证通过"
# [5] 构建并推送镜像
log_info "开始构建并推送多架构镜像..."
echo -e "${BLUE}构建参数:${NC}"
echo -e " 平台: linux/amd64,linux/arm64"
echo -e " 标签: ${IMAGE}:${TAG}, ${IMAGE}:latest"
echo -e " Dockerfile: ${DOCKERFILE_PATH}"
echo ""
docker buildx build \
--platform linux/amd64,linux/arm64 \
--tag "${IMAGE}:${TAG}" \
--tag "${IMAGE}:latest" \
--file "$DOCKERFILE_PATH" \
--push \
--progress=plain \
.
log_success "镜像构建并推送完成!"
# [6] 验证推送结果
log_info "验证镜像推送结果..."
echo -e "${GREEN}🎉 成功推送的镜像:${NC}"
echo -e " 📦 ${IMAGE}:${TAG}"
echo -e " 📦 ${IMAGE}:latest"
echo -e " 🏗️ 支持架构: linux/amd64, linux/arm64"
# [7] 清理选项提示
echo ""
log_info "构建完成!"
echo -e "${YELLOW}💡 如需清理构建器,运行: docker buildx rm $BUILDER_NAME${NC}"
echo -e "${YELLOW}💡 查看镜像详情: docker buildx imagetools inspect ${IMAGE}:${TAG}${NC}"
log_success "脚本执行完成!"
cd .. && mvn clean