无法通过Docked WebLogic(不使用intelliJ或Studio代码)将调试设置为适用于Java

无法通过Docked WebLogic(不使用intelliJ或Studio代码)将调试设置为适用于Java,java,docker,debugging,yaml,weblogic12c,Java,Docker,Debugging,Yaml,Weblogic12c,我想将调试器附加到停靠WebLogic 12c中已部署的WAR。 我使用WebLogic的官方图像(它是一个Linux容器) 我使用docker命令启动容器: docker run -d -p 4002:4002 -p 9002:9002 -v c:/my-path-to-shared-volume:/u01/oracle/properties -e ADMINISTRATION_PORT_ENABLED=true -e DOMAIN_NAME=docker_domain -e JAVA_

我想将调试器附加到停靠WebLogic 12c中已部署的WAR。 我使用WebLogic的官方图像(它是一个Linux容器) 我使用docker命令启动容器:

docker run -d -p 4002:4002 -p 9002:9002 
-v c:/my-path-to-shared-volume:/u01/oracle/properties 
-e ADMINISTRATION_PORT_ENABLED=true -e DOMAIN_NAME=docker_domain 
-e JAVA_TOOL_OPTIONS=\"-agentlib:jdwp=transport=dt_socket,address=4002,server=y,suspend=n\" 
--name weblogic store/oracle/weblogic:12.2.1.3-dev-200109
docker run -d --name weblogic -p 7001:7001 -p 9002:9002 -p 55195:55195 
-v c:/my-path:/u01/oracle/properties 
-e ADMINISTRATION_PORT_ENABLED=true -e DOMAIN_NAME=base_domain 
-e debugFlag=true -e DEBUG_PORT=55195 
store/oracle/weblogic:12.2.1.3
weblogic控制台在运行时激活,但在尝试运行调试器时,我的IDE显示:

无法打开调试器端口(localhost:4002):java.io.IOException “握手失败-连接提前关闭”

我的操作系统是Windows10。我尝试了Visual Studio代码和IntelliJ,得到了相同的输出。战争运行得很好,当我使用portman攻击一些服务端点时,它们会做出响应

看起来容器中的weblogic启动脚本尝试应用Java选项参数两次!请参见以下容器输出的相关部分:

域主页是:/u01/oracle/user\u projects/domains/docker\u Domain 选择了JAVA工具选项:“-agentlib:jdwp=transport=dt\u socket,address=localhost:4002,server=y,suspend=n” 正在侦听地址为4002的传输dt_套接字 正在初始化WebLogic脚本工具(WLST)。。。 欢迎使用WebLogic服务器管理脚本Shell

[…](我在下面的日志中看到:)

以行开始WLS: /usr/java/jdk-8/bin/java-server-Djava.security.egd=file:/dev//uradom-cp/u01/oracle/wlserver/server/lib/weblogic-launcher.jar-Dlaunch.use.env.classpath=true-Dweblogic.Name=AdminServer-Djava.security.policy=/u01/oracle/wlserver/server/server/lib/weblogic.policy-Djava.system.class.loader=com.oracle.classloader.weblogic.LaunchClassLoader=com-javaagent:/u01/oracle/wlserver/server/lib/debugpatch-agent.jar-da-Dwls.home=/u01/oracle/wlserver/server-Dweblogic.home=/u01/oracle/wlserver/server-weblogic.server 选择JAVA工具选项:“-agentlib:jdwp=transport=dt\u socket,address=localhost:4002,server=y,suspend=n” 错误:传输错误202:绑定失败:地址已在使用中 错误:JDWP传输dt_套接字初始化失败,传输初始化(510) JDWP exit error AGENT_error_TRANSPORT_INIT(197):未初始化任何传输[debugInit.c:750] 正在停止Derby服务器。。。 Derby服务器已停止

然后我尝试与docker compose合作,创建一个.yaml文件,在那里添加我的环境道具,试图防止这些道具运行两次。我也有同样的行为。无论我使用哪个端口,都会发现它已在使用中

这是我的.yaml文件

version: '2'
services:
  weblogic:
    container_name: weblogic_yamled
    image: store/oracle/weblogic:12.2.1.3-dev-200109
    ports:
        - "7001:7001"
        - "7002:7002"
        - "4002:4002"
        - "4003:4003"
        - "9002:9002" 
    volumes:
        - c:/my-path-to-shared-volume:/u01/oracle/properties
    environment:
        - ADMINISTRATION_PORT_ENABLED=true
        - DOMAIN_NAME=docker_domain
        - JAVA_TOOL_OPTIONS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=localhost:4002"
最后,我尝试了
transport=dt_shmem
,但是我得到了一个不同的错误:

错误:未找到传输库:dt_shmem


不知道还有什么我应该试试

尝试添加
地址=*:4002
而不是
地址=4002
您尝试过使用端口号+3(4005)吗?为容器化应用程序提供单独的调试端口是一种常见做法

JAVA\u OPTS
是一个特定于Tomcat的环境变量

在Java 8中,JDK支持
Java\u工具\u选项
环境变量,以便启用调试器。尝试将
JAVA\u选项
替换为
JAVA\u工具选项


您还必须像这样设置地址:
address=*:8000
address=localhost:4002
address=0.0.0.0:4002

我在附加内存监视工具(JVisualVM)时遇到了类似的问题。 我可以远程登录服务器,但这还不是全部

据我所知,阻碍我前进的是在引擎盖下使用的RMI连接。缺少的是客户端(调试器运行的地方)和主机(应用程序运行的地方)之间的“隧道”

在windows中,您将打开cmd并给出:

putty.exe -ssh <username>@<remote-host> -L <port>:<remote-host>:<same_port_again>
putty.exe-ssh@-L::
这将打开一个腻子窗口,该窗口在登录后应保持打开状态,以便隧道保持打开状态

有关这方面的更多信息,您可以查看@freedev提供的解决方案的第二步


我不确定它是否适用于您,但我怀疑它可能与我的情况相同。

问题是容器中的WebLogic服务器配置为在生产模式下运行(脚本setDomainEnv.sh中的生产模式变量的值设置为“true”)

要禁用此功能,需要打开文件setDomainEnv.sh,找到
PRODUCTION\u MODE=“true”
并将其更改为
PRODUCTION\u MODE=“false”

您也不需要设置JAVA_TOOL_OPTIONS变量,setDomainEnv.sh脚本已经可以在调试模式下启动。 要启用调试模式,需要在执行脚本之前将环境变量“debugFlag”设置为true

Docker命令:

docker run -d -p 4002:4002 -p 9002:9002 
-v c:/my-path-to-shared-volume:/u01/oracle/properties 
-e ADMINISTRATION_PORT_ENABLED=true -e DOMAIN_NAME=docker_domain 
-e JAVA_TOOL_OPTIONS=\"-agentlib:jdwp=transport=dt_socket,address=4002,server=y,suspend=n\" 
--name weblogic store/oracle/weblogic:12.2.1.3-dev-200109
docker run -d --name weblogic -p 7001:7001 -p 9002:9002 -p 55195:55195 
-v c:/my-path:/u01/oracle/properties 
-e ADMINISTRATION_PORT_ENABLED=true -e DOMAIN_NAME=base_domain 
-e debugFlag=true -e DEBUG_PORT=55195 
store/oracle/weblogic:12.2.1.3

注意,我还将调试端口更改为55195。

Thx以获取答案。相同的行为:java.io.IOException“握手失败-连接提前关闭”端口4002在映像中公开,您可以远程登录到主机上的端口4002吗?是的,4002和9002都是打开的,因此您可以访问从主机监听端口的调试器?@Thorbjørnravandersen yeap。。telnet和tcping的响应方式完全相同我很抱歉是的,我尝试了所有address=localhost:4002、address=*:4002和address=4002我已经编辑了我的答案,这可能会解决您在更新时遇到的问题@JohnPanThanks。它仍然无法连接,但我将用新发现更新我的问题。我做了更新。请注意,不接受任何多点地址语法。所以我坚持用
address=4002
@JohnPan,你试过用
docker run-d-p 9002:9002运行docker吗