无法在 docker 容器中的 Java 9 Tomcat 9 上远程调试

fxm*_*asa 4 java tomcat remote-debugging docker java-9

我有一个基于opendjdk:8-slim已安装 Tomcat 9的 Docker 容器,我正在调试从我的 IDE (IntelliJ) 部署在那里的应用程序 - IDE 在 Docker 主机上运行。我使用以下配置运行Tomcat

CATALINA_OPTS="-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=49520 \
-Dcom.sun.management.jmxremote.rmi.port=49520 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.local.only=false \
-Djava.rmi.server.hostname=10.0.75.1 \
-agentlib:jdwp=transport=dt_socket,address=49540,suspend=n,server=y"
Run Code Online (Sandbox Code Playgroud)

一切正常 - 我可以将 IDE 附加到容器。以下命令也有效(从 docker 主机执行) - 它可以连接到容器中的进程(容器中的端口 49540 映射到主机上的端口 49540):

docker-host$ telnet localhost 49540
Run Code Online (Sandbox Code Playgroud)

现在我想升级到 Java 9。我将基本映像从 更改openjdk:8-slimopenjdk:9-slim,但无法从 docker 主机连接到调试器端口。同样来自 IDE,我得到了SocketTimeoutException: Connection reset. 但是,从容器内部,我可以通过telnet.

我从openjdk存储库和其他存储库中尝试了几个 Java 9 图像,例如adenix/java,但不幸的是结果相同。

fxm*_*asa 8

最后,我找到了一种如何使用 Alan Bateman 提供的评论中的信息使其工作的方法。

CATALINA_OPTS我没有设置调试设置(在 JDK 8 中没有问题),而是JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=*:4954??0,server=y,suspend=n??"使用catalina.sh jpda run. address=192.168.16.1:49540尽管可以从容器内访问 IP 地址,但具体的 IP 地址(例如)仍然对我不起作用。

  • 要点是,在 Java 8 及更早版本中,当您仅将端口指定为“address”时,它会侦听所有 IP 地址,例如“address=4954‌​0”。从 Java 9 开始,默认情况下它只会监听 `127.0.0.1`,并且您需要明确指定要监听所有 IP 地址,例如 `address=*:4954‌​0`。 (2认同)