无法远程调试 Java 9 Tomcat 9 in docker 容器

Can't remotely debug on Java 9 Tomcat 9 in docker container

我有一个基于 opendjdk:8-slim 并安装了 Tomcat 9 的 Docker 容器,我正在调试从我的 IDE (IntelliJ) 部署到那里的应用程序 - IDE 运行s 在 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"

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

docker-host$ telnet localhost 49540

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

连接到调试器

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

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

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

我在 docker-compose.yaml 这个环境变量中使用 运行 在 Java 9Tomcat 9:

...
    environment:
      - "JPDA_ADDRESS=*:8000"
...

Java 8 之前我使用的是:

...
    environment:
      - "JPDA_ADDRESS=8000"
...