Can';t在docker容器中远程调试Java 9 Tomcat 9

Can';t在docker容器中远程调试Java 9 Tomcat 9,java,tomcat,docker,remote-debugging,java-9,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 \ -Dc

我有一个基于
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主机执行)-它可以连接到容器中的进程(容器中的端口49540映射到主机上的端口49540):

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


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

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


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

我在docker-compose.yaml中使用此环境变量,以便在Java 9中使用Tomcat 9

...
    environment:
      - "JPDA_ADDRESS=*:8000"
...
Java8之前,我使用的是:

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

尝试使用
address=0.0.0.0:49540
看看它是否有帮助在JDK 9中,JDWP默认绑定到本地主机,yu可能需要指定address=*。发布说明中的更多详细信息如下:@AlanBateman非常感谢您提供的线索!我尝试指定地址-既有
*
又有具体的ip地址
192.168.16.1
。现在我成功了在Tomcat启动过程中忽略以下错误:
错误:传输错误202:绑定失败:无法分配请求的地址错误:JDWP传输dt_套接字未能初始化,传输_INIT(510)JDWP退出错误代理_ERROR_传输_INIT(197):未初始化传输[debugInit.c:730]
我尝试从容器ping IP地址,但成功。“无法分配…”。。。“表示这不是docker容器中的地址。我很惊讶
address=*:49540
不起作用,因为这相当于JDK 8的
address=49540
。谢谢。我在tomcat-9、JDK-11上工作过,主要的一点是,在Java 8和更早版本中,当您只将一个端口指定为
地址时,它将侦听所有ip地址,例如
地址=4954‌​0
。从Java 9开始,默认情况下它将只侦听
127.0.0.1
,您需要明确指定要侦听所有ip地址,例如
address=*:4954‌​0
...
    environment:
      - "JPDA_ADDRESS=8000"
...