我有一个基于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
,但遗憾的是结果相同。
答案 0 :(得分:1)
最后,我找到了一种如何使用Alan Bateman提供的评论中的信息来使其工作的方法。
我没有在CATALINA_OPTS
中设置调试设置(可以毫无问题地使用JDK 8),而是设置JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=*:49540,server=y,suspend=n"
并使用catalina.sh jpda run
运行Tomcat。具体的IP地址(例如address=192.168.16.1:49540
)对我来说仍然不起作用,尽管可以从容器内访问IP地址。
答案 1 :(得分:0)
我在我的 docker-compose.yaml 中使用这个环境变量在 Java 9 和 Tomcat 9 中运行:
...
environment:
- "JPDA_ADDRESS=*:8000"
...
在 Java 8 之前,我使用的是:
...
environment:
- "JPDA_ADDRESS=8000"
...