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

时间:2017-11-07 22:07:15

标签: java tomcat docker remote-debugging java-9

我有一个基于opendjdk:8-slim的Docker容器,安装了Tomcat 9,我正在调试从我的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"

一切都很好 - 我可以将IDE附加到容器中。此命令也起作用(从docker host执行) - 它可以连接到容器中的进程(容器中的端口49540映射到主机上的端口49540):

docker-host$ telnet localhost 49540

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

Java 8 之前,我使用的是:

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