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

执行后

推送完成移除

云校镜像中

相关推荐
wtblszn1 小时前
自动化包装生产线设备可视化管理方案
运维·自动化
一 乐1 小时前
动漫书销售商城|基于springboot + vue动漫书销售商城(源码+数据库+文档)
java·数据库·vue.js·spring boot·毕业设计
卓怡学长1 小时前
w214基于jsp知道特产网
java·intellij-idea
步行cgn1 小时前
Spring 注解使用详解
java·spring
一条小小yu1 小时前
Spring IoC的理解
java·后端·spring
落魄实习生2 小时前
Agent Scope Java 2.x 系列【7】工具使用
java·开发语言·ai
心之语歌2 小时前
Tkinter 画布基本梳理
运维·服务器·python
旺仔学长 哈哈2 小时前
springboot钓鱼爱好者交流平台APP设计与实现
java·spring boot·mysql·充电桩管理系统
Shulex2 小时前
面向跨境电商多渠道消息系统的技术架构:亚马逊站内信合规对接与自动化执行链路设计
运维·架构·自动化
bloglin999993 小时前
vmware部署centos7启动docker容器后无法访问服务
运维·docker·容器