我需要在 prod 上运行 JCMD 来监控我的应用程序,但不幸的是我没有合适的 JDK,所以我需要使用 JRE 运行它。我可以添加一些依赖项,但不能添加整个 jdk。
我正在使用 openJDK 8。
有谁知道该怎么做?
这里已经发布了一个问题(How to run jcmd without the JDK?),但答案适用于 windows 服务器,不适用于 docker 容器中的 linux OS。
我需要在 prod 上运行 JCMD 来监控我的应用程序,但不幸的是我没有合适的 JDK,所以我需要使用 JRE 运行它。我可以添加一些依赖项,但不能添加整个 jdk。
我正在使用 openJDK 8。
有谁知道该怎么做?
这里已经发布了一个问题(How to run jcmd without the JDK?),但答案适用于 windows 服务器,不适用于 docker 容器中的 linux OS。
根据我的个人经验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 中测试了它们。