open-java21镜像构建

因部署云效流水线需要使用Java21版本的镜像,尝试了很多都无法正常使用拉取,在此自己进行打包处理处理

阿里云效镜像私服可以选择企业和个人,如下链接可以申请开通

https://cr.console.aliyun.com/cn-beijing/instances

这里我使用个人版本

build脚本

bash 复制代码
#!/bin/bash

# 设置变量
IMAGE_NAME="openjdk-21-alpine"
TAG="21.0.0-alpine3.18"
#REGISTRY="registry.cn-beijing.aliyuncs.com"
REGISTRY="xxxxxx.com"  
NAMESPACE="zzz"  # 根据你的命名空间修改
regName="xxx_repository" #仓库名称
FULL_IMAGE_NAME="${REGISTRY}/${NAMESPACE}/${regName}/${IMAGE_NAME}:${TAG}"

# 创建临时构建目录
BUILD_DIR="$(pwd)/tmp-build-jdk21"
rm -rf "$BUILD_DIR"
mkdir -p "$BUILD_DIR"

echo "准备构建JDK 21镜像..."

# 复制Dockerfile到构建目录
cp Dockerfile.jdk21 "$BUILD_DIR/Dockerfile"

# 检查JDK文件是否存在
JDK_SOURCE="/xworks/envs/openjdk21/jdk-21_linux-x64_bin.tar.gz"
if [ ! -f "$JDK_SOURCE" ]; then
    echo "错误: JDK文件不存在: $JDK_SOURCE"
    exit 1
fi

# 复制JDK到构建目录
echo "复制JDK文件到构建目录..."
cp "$JDK_SOURCE" "$BUILD_DIR/jdk-21_linux-x64_bin.tar.gz"

# 进入构建目录
cd "$BUILD_DIR"

echo ls

# 构建镜像
echo "开始构建Docker镜像..."
docker build -t "$IMAGE_NAME:$TAG" .

docker images

if [ $? -eq 0 ]; then
    echo "镜像构建成功!"

    # 重新标记为阿里云镜像
    docker tag "$IMAGE_NAME:$TAG" "$FULL_IMAGE_NAME"

    echo "准备推送到阿里云容器镜像服务..."

    # 登录阿里云容器镜像服务
    #docker login "$REGISTRY" --username=你的阿里云用户名
    


    if [ $? -eq 0 ]; then
        # 推送镜像
        docker push "$FULL_IMAGE_NAME"

        if [ $? -eq 0 ]; then
            echo "镜像推送成功!"
            echo "镜像地址: $FULL_IMAGE_NAME"

            # 清理临时目录
            cd ..
            rm -rf "$BUILD_DIR"

            echo "镜像信息:"
            echo "名称: $IMAGE_NAME"
            echo "标签: $TAG"
            echo "完整地址: $FULL_IMAGE_NAME"
        else
            echo "镜像推送失败 ! $FULL_IMAGE_NAME "
        fi
    else
        echo "阿里云登录失败!"
    fi
else
    echo "镜像构建失败!"
fi

如上基本配置信息在云效中

本地jar添加到alpine

bash 复制代码
FROM alpine:3.18

# 安装glibc兼容层(某些JDK需要)
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \
    apk add --no-cache \
    tzdata \
    bash \
    fontconfig \
    ttf-dejavu \
    libstdc++ \
    && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo "Asia/Shanghai" > /etc/timezone

# 使用COPY和RUN分开,以便删除源文件
COPY jdk-21_linux-x64_bin.tar.gz /tmp/

# 先创建目录,然后解压到/usr/java目录
RUN mkdir -p /usr/java && \
    tar -xzf /tmp/jdk-21_linux-x64_bin.tar.gz -C /usr/java/ && \
    rm -f /tmp/jdk-21_linux-x64_bin.tar.gz && \
    # 查找并设置
    cd /usr/java && \
    # 找到解压后的目录
    JDK_DIR=$(find . -maxdepth 1 -type d ! -name "." | head -1) && \
    # 重命名为jdk
    mv "$JDK_DIR" jdk && \
    # 查看结构
    echo "=== JDK结构 ===" && \
    ls -la /usr/java/jdk/ && \
    echo -e "\n=== 查找可执行文件 ===" && \
    find /usr/java/jdk -type f -executable -name "java" | head -5

# 尝试多种可能的java路径
RUN if [ -f /usr/java/jdk/bin/java ]; then \
        echo "使用 /usr/java/jdk/bin/java" && \
        JAVA_HOME=/usr/java/jdk; \
    elif [ -f /usr/java/jdk/jre/bin/java ]; then \
        echo "使用 /usr/java/jdk/jre/bin/java" && \
        JAVA_HOME=/usr/java/jdk; \
    elif [ -f /usr/java/jdk/Contents/Home/bin/java ]; then \
        echo "使用 macOS 风格路径" && \
        JAVA_HOME=/usr/java/jdk/Contents/Home; \
    else \
        echo "查找java..." && \
        JAVA_EXEC=$(find /usr/java -name "java" -type f -executable | head -1) && \
        echo "找到: $JAVA_EXEC" && \
        JAVA_HOME=$(dirname $(dirname "$JAVA_EXEC")); \
    fi && \
    echo "设置 JAVA_HOME=$JAVA_HOME" && \
    ln -sf $JAVA_HOME /opt/java && \
    ln -sf $JAVA_HOME/bin/java /usr/bin/java

ENV JAVA_HOME=/opt/java
ENV PATH=$JAVA_HOME/bin:$PATH

# 安装后验证
RUN /usr/bin/java -version 2>&1 || \
    $JAVA_HOME/bin/java -version 2>&1 || \
    (echo "尝试直接执行..." && find /usr/java -name "java" -exec {} --version \; 2>/dev/null | head -1)

WORKDIR /app

赋予执行权限

bash 复制代码
chmod +x build-jdk21-image.sh

执行后

推送完成移除

云校镜像中

相关推荐
测试修炼手册5 小时前
[测试工具] 用 Codex 做测试实战:从需求分析到自动化用例落地
运维·自动化·需求分析
米高梅狮子5 小时前
03.网络类服务实践
linux·运维·服务器·网络·kubernetes·centos·openstack
一直不明飞行5 小时前
Java的equals(),hashCode()应该在什么时候重写
java·开发语言·jvm
REDcker5 小时前
有限状态机与状态模式详解 FSM建模Java状态模式与C++表驱动模板实践
java·c++·状态模式
你的保护色6 小时前
【无标题】
java·服务器·网络
basketball6166 小时前
C++ 构造函数完全指南:从入门到进阶
java·开发语言·c++
IpdataCloud6 小时前
稳定的企业级IP数据接口怎么选?可用性指标+离线库高可用方案
运维·网络·tcp/ip
WebGIS开发6 小时前
地信职业百科②:GIS运维
运维·gis·就业·转行
淘矿人6 小时前
Claude辅助DevOps实践
java·大数据·运维·人工智能·算法·bug·devops
JiaWen技术圈6 小时前
nginx 安全响应头 介绍
运维·nginx·安全