jcmd
在JDK/bin
而非JRE上可用。 确保已安装的Java是JDK,而不是JRE。
让我们回顾以下示例,尝试使用jcmd
在jcmd
容器内启用Java Flight Recorder。
1. DockerFile
一个简单的Dokcerfile。
Dockerfile
FROM adoptopenjdk/openjdk11:alpine-jre
ARG JAR_FILE=target/markdown.jar
WORKDIR /opt/app
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","app.jar"]
2. Docker + jcmd
访问jcmd
容器的外壳,尝试使用jcmd
启用Java Flight Recorder,但未找到hits命令?
Terminal
$ docker exec -it 3d1588519433 sh
/opt/app # jcmd
sh: jcmd: not found
/opt/app # which java
/opt/java/openjdk/bin/java
/opt/app # java -version
openjdk version "11.0.7" 2020-04-14
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.7+10)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.7+10, mixed mode)
/opt/app #
解
同样, jcmd
在JDK/bin
可用,而不在JRE上可用。 Dockerfile
使用的是openjdk11:alpine-jre
,即JRE映像。
Dockerfile
FROM adoptopenjdk/openjdk11:alpine-jre
要修复它,请尝试安装JDK映像。
Dockerfile
FROM adoptopenjdk/openjdk11:alpine
再次测试。
Terminal
$ docker exec -it <container ID> sh
/opt/app # jcmd
48 jdk.jcmd/sun.tools.jcmd.JCmd
1 app.jar
做完了