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

执行后

推送完成移除

云校镜像中

相关推荐
乌托邦的逃亡者4 小时前
CentOS/Openeuler主机中,为一个网卡设置多个IP地址
linux·运维·网络·tcp/ip·centos
Advancer-4 小时前
第二次蓝桥杯总结(上)
java·算法·职场和发展·蓝桥杯
\xin4 小时前
pikachu自编SQL(POST)
java·数据库·sql
一行代码一行诗++4 小时前
注释是什么和注释该怎么写(C语言)
java·前端·javascript
拾贰_C5 小时前
【OpenClaw | openai | QQ】 配置QQ qot机器人
运维·人工智能·ubuntu·面试·prompt
桌面运维家5 小时前
服务器进程异常监控:快速定位与排障实战指南
运维·服务器
JAVA面经实录9175 小时前
企业级java+LangChain4j-RAG系统 限流熔断降级
java·开发语言·分布式·langchain
Drug5 小时前
Struts2 从入门到放弃?不,这些核心知识你依然需要掌握
java
Java后端的Ai之路5 小时前
Kubernetes是什么?(小白入门版)
云原生·容器·kubernetes·教程
Slow菜鸟5 小时前
Codex CLI 教程(五)| AI 驱动项目从零到一:面向 Java 全栈工程师打造个人 ECC(V2版)
java·开发语言·人工智能