Java 无法使用IntelliJ在Docker容器内调试Websphere Application Server

Java 无法使用IntelliJ在Docker容器内调试Websphere Application Server,java,docker,intellij-idea,dockerfile,websphere-8,Java,Docker,Intellij Idea,Dockerfile,Websphere 8,我正在尝试将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"

我正在尝试将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=""
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
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,server=y,suspend=n,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运行命令如下所示:

debugMode="true" debugArgs="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=7777" genericJvmArguments=""
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_工具_选项作为环境变量传递也不起作用。此时,我可以在调试模式下启动服务器,但没有任何可附加调试器的侦听端口,或者由于上述错误,服务器无法启动侦听端口。

而不是使用

#ENV JAVA_TOOL_OPTIONS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=7777
我相信推荐的过程是将这些调试选项放在属性文件(debug.props)中,并放在以下位置:

然后复制到docker图像:

COPY --chown=was:root debug.props /work/config/debug.props
最后,应用此配置:

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

请参见此处的示例项目:

在使用IntelliJ之后,设法解决了这个问题

我试着按照这个指南去做


然而,这需要一些额外的设置。我必须将websphere映像配置为构建,并将其设置为始终在调试模式下启动(可能会导致进一步的速度减慢,但这是一种允许我调试的变通方法,可以在重建映像时删除)。在此之后,我只能在服务器完全启动后连接远程调试器。没有提示服务器有可用的端口可侦听,但确实有。使用“调试前启动docker”选项将导致连接失败。谢谢你的帮助

“没有监听端口”是什么意思?即使7777:7777已公开,调试器也从未成功附加?envvar应该是不必要的,我怀疑它导致了在端口7777上的双重绑定,并且已经设置了调试参数。我想知道您是否可以在/opt/IBM/WebSphere/AppServer/java/bin:
/jdb-attach localhost:7777
中使用jdb从容器本身进行连接,他们在顶部提到,调试参数已经在server.xml中设置了,所以我认为这不会有任何额外的影响。要么JVM没有监听,要么Docker网络中的某些东西干扰了调试器的连接。