#!/bin/bash set -euo pipefail # 配置参数 IMAGE_NAME="jdk" VERSION="17.0.16-ubuntu22-dos" HARBOR_REGISTRY="192.168.10.102:8001" # 替换为实际的Harbor地址 HARBOR_PROJECT="xiaomayi-base" # 替换为实际的Harbor项目名 HARBOR_USERNAME="deploy" # 替换为Harbor用户名 HARBOR_PASSWORD="Harbor20240330" # 替换为Harbor密码 # 完整的镜像标签 FULL_IMAGE_NAME="${HARBOR_REGISTRY}/${HARBOR_PROJECT}/${IMAGE_NAME}" TAG_VERSION="${VERSION}" TAG_LATEST="latest" # 颜色输出函数 red() { echo -e "\033[31m$*\033[0m"; } green() { echo -e "\033[32m$*\033[0m"; } yellow() { echo -e "\033[33m$*\033[0m"; } blue() { echo -e "\033[34m$*\033[0m"; } # 检查必要文件 check_requirements() { blue "检查构建所需文件..." if [ ! -f "jdk-17.0.16_linux-x64_bin.tar.gz" ]; then red "错误: jdk-17.0.16_linux-x64_bin.tar.gz 不存在" echo "请从Oracle官网下载JDK 17.0.16并放置在当前目录" exit 1 fi if [ ! -d "fonts" ]; then yellow "提示: fonts 目录不存在,创建空目录" mkdir -p fonts/ yellow "可以放置中文字体文件到 fonts/ 目录以获得更好的中文支持" fi green "✓ 文件检查完成" } # 登录Harbor仓库 login_to_harbor() { blue "登录Harbor仓库: ${HARBOR_REGISTRY}" if echo "${HARBOR_PASSWORD}" | docker login -u "${HARBOR_USERNAME}" --password-stdin "${HARBOR_REGISTRY}"; then green "✓ Harbor登录成功" else red "✗ Harbor登录失败" exit 1 fi } # 构建Docker镜像 build_image() { blue "开始构建Docker镜像..." local build_cmd=( docker build # --pull # --no-cache -t "${FULL_IMAGE_NAME}:${TAG_VERSION}" # -t "${FULL_IMAGE_NAME}:${TAG_LATEST}" . ) echo "执行命令: ${build_cmd[*]}" if "${build_cmd[@]}"; then green "✓ 镜像构建成功" else red "✗ 镜像构建失败" exit 1 fi } # 显示镜像信息 show_image_info() { blue "镜像构建信息:" echo "----------------------------------------" docker images "${FULL_IMAGE_NAME}" --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}" echo "----------------------------------------" # 显示详细大小信息 local image_size=$(docker image inspect "${FULL_IMAGE_NAME}:${TAG_VERSION}" --format='{{.Size}}' | awk '{printf "%.2f MB", $1/1024/1024}') green "镜像大小: ${image_size}" } # 测试镜像功能 test_image() { blue "测试镜像功能..." echo "1. 测试Java版本:" if docker run --rm "${FULL_IMAGE_NAME}:${TAG_VERSION}" java -version; then green "✓ Java测试通过" else red "✗ Java测试失败" exit 1 fi echo "2. 测试区域设置:" if docker run --rm "${FULL_IMAGE_NAME}:${TAG_VERSION}" locale; then green "✓ 区域设置测试通过" else red "✗ 区域设置测试失败" exit 1 fi echo "3. 测试时区设置:" if docker run --rm "${FULL_IMAGE_NAME}:${TAG_VERSION}" date; then green "✓ 时区测试通过" else red "✗ 时区测试失败" exit 1 fi } # 推送镜像到Harbor push_to_harbor() { blue "推送镜像到Harbor仓库..." # 推送版本标签 if docker push "${FULL_IMAGE_NAME}:${TAG_VERSION}"; then green "✓ 版本标签推送成功: ${TAG_VERSION}" else red "✗ 版本标签推送失败" exit 1 fi # # 推送latest标签 # if docker push "${FULL_IMAGE_NAME}:${TAG_LATEST}"; then # green "✓ latest标签推送成功" # else # red "✗ latest标签推送失败" # exit 1 # fi } # 清理本地镜像 cleanup_local() { blue "清理本地镜像..." docker rmi "${FULL_IMAGE_NAME}:${TAG_VERSION}" "${FULL_IMAGE_NAME}:${TAG_LATEST}" 2>/dev/null || true green "✓ 本地镜像清理完成" } # 验证远程镜像 verify_remote_image() { blue "验证远程镜像..." # 尝试拉取验证 if docker pull "${FULL_IMAGE_NAME}:${TAG_VERSION}"; then green "✓ 远程镜像验证成功" docker rmi "${FULL_IMAGE_NAME}:${TAG_VERSION}" 2>/dev/null || true else red "✗ 远程镜像验证失败" exit 1 fi } # 生成使用说明 generate_usage() { cat << EOF $(green "=== 镜像构建和推送完成 ===") $(blue "镜像名称:") ${FULL_IMAGE_NAME} $(blue "可用标签:") ${TAG_VERSION}, ${TAG_LATEST} $(yellow "使用方法:") 1. 拉取镜像: docker pull ${FULL_IMAGE_NAME}:${TAG_VERSION} 2. 运行测试: docker run --rm ${FULL_IMAGE_NAME}:${TAG_VERSION} java -version 3. 作为基础镜像使用: FROM ${FULL_IMAGE_NAME}:${TAG_VERSION} $(green "镜像已成功推送到Harbor仓库!") EOF } # 主函数 main() { echo "$(blue '=== Ubuntu 22.04 JDK 17 基础镜像构建脚本 ===')" echo "$(blue "目标仓库: ${HARBOR_REGISTRY}")" echo "$(blue "镜像名称: ${IMAGE_NAME}")" echo "$(blue "版本标签: ${VERSION}")" echo "----------------------------------------" # 执行步骤 check_requirements login_to_harbor build_image show_image_info test_image push_to_harbor cleanup_local verify_remote_image generate_usage green "✅ 所有步骤完成!" } # 异常处理 trap 'red "脚本执行被中断"; exit 1' INT TERM # 执行主函数 main "$@"