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

执行后

推送完成移除

云校镜像中

相关推荐
Fcy64821 小时前
Linux下 进程控制(一) —— 进程的创建、终止和等待
linux·运维·elasticsearch·进程控制·进程创建、终止、等待
菜鸡儿齐21 小时前
Unsafe方法学习
java·python·学习
汤姆yu21 小时前
IDEA接入Claude Code保姆级教程(Windows专属+衔接前置安装)
java·windows·intellij-idea·openclaw·openclasw安装
prince051 天前
用户积分系统怎么设计
java·大数据·数据库
龙飞051 天前
Kubernetes 疑难杂症:Pod 始终处于 Terminating 状态的真实原因与安全修复方案
安全·云原生·容器·kubernetes
96771 天前
理解IOC控制反转和spring容器,@Autowired的参数的作用
java·sql·spring
SY_FC1 天前
实现一个父组件引入了子组件,跳转到其他页面,其他页面返回回来重新加载子组件函数
java·前端·javascript
耀耀_很无聊1 天前
09_Jenkins安装JDK环境
java·运维·jenkins
MaximusCoder1 天前
等保测评命令——Centos Linux
linux·运维·经验分享·python·安全·centos
ノBye~1 天前
Centos7.6 Docker安装redis(带密码 + 持久化)
java·redis·docker