因部署云效流水线需要使用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
执行后


推送完成移除

云校镜像中
