0

我需要在 prod 上运行 JCMD 来监控我的应用程序,但不幸的是我没有合适的 JDK,所以我需要使用 JRE 运行它。我可以添加一些依赖项,但不能添加整个 jdk。

我正在使用 openJDK 8。

有谁知道该怎么做?

这里已经发布了一个问题(How to run jcmd without the JDK?),但答案适用于 windows 服务器,不适用于 docker 容器中的 linux OS。

4

1 回答 1

1

根据我的个人经验jcmd,Java 的新版本适用于旧版本。您可以利用多阶段构建功能并jlink为您优雅地打包(严格)必要的文件,请参考Dockerfile

FROM adoptopenjdk:11-jdk-hotspot

RUN ${JAVA_HOME}/bin/jlink --module-path jmods --add-modules jdk.jcmd --output /jcmd 

FROM adoptopenjdk:8-jre-hotspot
        
COPY --from=0 /jcmd /jcmd

如果您愿意,我会为您提供 Java 8 的“一个”答案,使用采用 openjdk 和多阶段构建

FROM adoptopenjdk:8-jdk-hotspot

RUN mkdir -p /jcmd && \
    mkdir -p /jcmd/bin && \
    mkdir -p /jcmd/lib && \
    cp ${JAVA_HOME}/bin/jcmd /jcmd/bin/jcmd && \
    cp -r ${JAVA_HOME}/lib/* /jcmd/lib


FROM adoptopenjdk:8-jre-hotspot
        
COPY --from=0 /jcmd ${JAVA_HOME}

在这种情况下jcmd,与 jre 一起安装,与 java 位于同一 bin 文件夹中。

我在 docker-desktop 20.10.7 和 Mirantis (Docker Enterprise) 3.3.11 中测试了它们。

于 2021-07-20T12:08:46.803 回答