无法使用IntelliJ

问题描述

我正在尝试将WAS移至容器中,并继续具有对其进行调试的能力。它是传统的WAS版本8.5.5.17。我已经尝试了多种方法,但是无法使用IntelliJ成功附加远程调试器。通过server.xml查看时,WAS设置为debugMode,但是没有侦听端口。与调试相关的JVM属性设置如下:

debugMode="true" debugArgs="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=7777" genericJvmArguments=""

Dockerfile:

FROM ibmcom/websphere-Traditional:8.5.5.17

copY db /work/config/db
copY MQ /work/config/MQ
copY earear /work/config/ear.ear
copY custom_jvm_properties.txt /work/config/custom_jvm_properties.txt
copY file.properties /work/config/file.properties
copY Sscript.py /work/config/Script.py
copY jars/work/config/jars
RUN mkdir -p /work/config/Folder

RUN /work/configure.sh

#ENV JAVA_TOOL_OPTIONS -agentlib:jdwp=transport=dt_socket,address=7777
EXPOSE 80 9080 9448 9443 9060 9043 7777

当我使用上述文件构建映像时,将构建容器并运行该应用程序。取消注释#ENV行会导致生成映像,但是运行容器会导致以下错误

ERROR: transport error 202: bind Failed: Address already in use
ERROR: JDWP Transport dt_socket Failed to initialize,TRANSPORT_INIT(510)
JDWP exit error AGENT_ERROR_TRANSPORT_INIT(197): No transports initialized [debugInit.c:762]

我的docker run命令如下:

docker run -p 80:80 -p 9080:9080 -p 9448:9448 -p 9443:9443 -p 9060:9060 -p 9043:9043 -p 7777:7777 -v C:\volume:/volume --name ContainerName image

尝试将JAVA_TOOL_OPTIONS作为环境变量传递也不起作用。此时,我可以在调试模式下启动服务器,但是没有任何侦听端口可将调试器连接到该服务器,或者由于上述错误,服务器无法从侦听端口启动。

解决方法

代替使用提供调试选项

#ENV JAVA_TOOL_OPTIONS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=7777

我相信建议的过程是将这些调试选项放在属性文件(debug.props)下:

debugArgs="-agentlib:jdwp=transport=dt_socket,address=7777"

然后复制到您的docker映像:

COPY --chown=was:root debug.props /work/config/debug.props

最后,应用此配置:

RUN work/applyConfig.sh /work/config/debug.props

在此处查看示例项目:https://github.com/WASdev/ci.docker.websphere-traditional/tree/10367b51ccbf489cd6e1655769b968e9d9bfca13/samples/batch-compute-grid

,

在玩弄IntelliJ之后设法弄清楚了。

我正在尝试遵守本指南https://blog.jetbrains.com/idea/2019/04/debug-your-java-applications-in-docker-using-intellij-idea/

但是,它进行了一些附加设置。我必须配置Websphere映像以进行构建并将其设置为始终在调试模式下启动(可能会进一步降低运行速度,但这是一种变通办法,它使我可以进行调试,并且可以在重建映像时将其删除)。此后,只有在服务器完全启动后,我才能附加远程调试器。没有提示服务器有可用的端口来监听,但确实如此。使用“在调试之前启动docker”选项将导致附加失败。感谢您的帮助!