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

执行后

推送完成移除

云校镜像中

相关推荐
2601_962100731 小时前
2026年旧素材怎么二次利用:图文批量转视频的自动化工作流工程复盘
运维·自动化·音视频
彬冷的心2 小时前
K8s 部署若依项目 + Harbor 私有仓库(双节点版)
云原生·容器·kubernetes
hfywmsj2 小时前
广州餐饮铺位招租的选址架构:流量入口与成本函数分析
java·大数据·jvm·广州餐饮铺位招租
爪哇岛国人2 小时前
原来我一直理解错了:实现接口真的必须实现所有方法吗?
java
Ruiery2 小时前
Linux 6.6内核 PCIe 深度解析(九):复位机制 — 从 FLR 到 Secondary Bus Reset 的降级链
linux·运维·服务器
想要成为老金高手2 小时前
Kubernetes Service 深度实践:从 ClusterIP 到 Ingress 七层代理
云原生·容器·kubernetes
Wang's Blog2 小时前
Vibe Coding一人即团队系列59:基于PPTmaster与Claude Desktop的本地可编辑PPT自动化生成方案
运维·自动化·powerpoint
万年咸鱼2 小时前
Java BufferedOutputStream 详解:原理、用法与性能优化
java·开发语言·性能优化
不剪发的Tony老师2 小时前
Navop:一款工具搞定数据库、SSH、SFTP、远程桌面、AI Agent
运维·数据库·ssh
码力斜杠哥2 小时前
Docker Compose快速入门笔记
笔记·docker·eureka