在eclipse-temurin:21镜像安装Sencha Cmd遇JVM版本错误求助
我尝试基于eclipse-temurin:21 Docker镜像安装Sencha Cmd 7.8.0.59,使用的Dockerfile如下:
FROM eclipse-temurin:21 as builder ENV CMD_VERSION="7.8.0.59" RUN apt-get update && apt-get install -y --no-install-recommends \ wget \ unzip \ libfreetype6 \ fontconfig \ && rm -rf /var/lib/apt/lists/* WORKDIR /work RUN wget --no-cookies https://cdn.sencha.com/cmd/${CMD_VERSION}/no-jre/SenchaCmd-${CMD_VERSION}-linux-amd64.sh.zip \ && unzip SenchaCmd-${CMD_VERSION}-linux-amd64.sh.zip -d . \ && chmod o+x SenchaCmd-${CMD_VERSION}-linux-amd64.sh \ && ./SenchaCmd-${CMD_VERSION}-linux-amd64.sh -Dall=true -q -dir /opt/Sencha/Cmd/${CMD_VERSION}
但安装程序执行失败,报错信息:
No suitable Java Virtual Machine could be found on your system.
The version of the JVM must be 1.8.
Please define INSTALL4J_JAVA_HOME to point to a suitable JVM.
容器内执行java -version的输出:
openjdk version "21.0.3" 2024-04-16 LTS OpenJDK Runtime Environment Temurin-21.0.3+9 (build 21.0.3+9-LTS) OpenJDK 64-Bit Server VM Temurin-21.0.3+9 (build 21.0.3+9-LTS, mixed mode, sharing)
执行echo "$JAVA_HOME"的输出:
/opt/java/openjdk
请问如何解决这个问题?这是Sencha Cmd 7.8.0.59 Linux安装程序的bug吗?(我在M2 Mac上用temurin 21搭配osx-arm版本的安装程序可以正常运行。)
解决方法
方案1:用多阶段构建,临时使用JDK 8完成安装
Sencha Cmd的Linux无JRE版本安装包,其底层的Install4J引导程序强制要求安装阶段使用JDK 8。可以通过多阶段构建,先在JDK 8环境下完成安装,再将安装好的Cmd复制到JDK 21的最终镜像中:
修改后的Dockerfile示例:
# 最终镜像使用JDK 21 FROM eclipse-temurin:21 as final ENV CMD_VERSION="7.8.0.59" # 构建阶段使用JDK 8安装Sencha Cmd FROM eclipse-temurin:8 as builder ENV CMD_VERSION="7.8.0.59" RUN apt-get update && apt-get install -y --no-install-recommends \ wget \ unzip \ libfreetype6 \ fontconfig \ && rm -rf /var/lib/apt/lists/* WORKDIR /work RUN wget --no-cookies https://cdn.sencha.com/cmd/${CMD_VERSION}/no-jre/SenchaCmd-${CMD_VERSION}-linux-amd64.sh.zip \ && unzip SenchaCmd-${CMD_VERSION}-linux-amd64.sh.zip -d . \ && chmod o+x SenchaCmd-${CMD_VERSION}-linux-amd64.sh \ && ./SenchaCmd-${CMD_VERSION}-linux-amd64.sh -Dall=true -q -dir /opt/Sencha/Cmd/${CMD_VERSION} # 将安装好的Sencha Cmd复制到最终镜像 FROM final COPY --from=builder /opt/Sencha /opt/Sencha # 配置Sencha Cmd到环境变量 ENV PATH="/opt/Sencha/Cmd/${CMD_VERSION}:${PATH}"
方案2:下载带JRE的Sencha Cmd安装包
如果不想额外引入JDK 8,可以直接下载包含JRE的安装包,安装程序会自带符合要求的JVM,无需依赖系统JDK:
修改Dockerfile中的下载链接,去掉no-jre/路径:
https://cdn.sencha.com/cmd/${CMD_VERSION}/SenchaCmd-${CMD_VERSION}-linux-amd64.sh.zip
关于是否是bug的说明
这不算严格意义上的bug,而是Linux版本Sencha Cmd安装程序的设计限制:其底层的Install4J引导程序仅支持JDK 8启动,而Mac版本的安装程序做了适配,允许在高版本JDK下执行。但Sencha Cmd本身安装完成后,完全可以在JDK 21环境下正常运行。
内容的提问来源于stack exchange,提问作者Bent André Solheim

