Debugging 在Docker容器中调试Tomcat

Debugging 在Docker容器中调试Tomcat,debugging,tomcat,intellij-idea,jpda,Debugging,Tomcat,Intellij Idea,Jpda,我有一个科瑞奥斯在流浪。流浪者专用网络IP为192.168.111.1。CoreOS内部是一个带有Tomcat 8.0.32的docker容器。几乎所有事情都正常(应用程序部署等),只是调试不正常。Tomcat映射到8080端口,JPDA端口应该是8000 事实 Tomcat JPDA配置有: JDPA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000 它以catalina.sh jpda start

我有一个科瑞奥斯在流浪。流浪者专用网络IP为192.168.111.1。CoreOS内部是一个带有Tomcat 8.0.32的docker容器。几乎所有事情都正常(应用程序部署等),只是调试不正常。Tomcat映射到8080端口,JPDA端口应该是8000

事实 Tomcat JPDA配置有:

JDPA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000
它以
catalina.sh jpda start
命令开始。使用
docker compose
运行控制台时,控制台中的输出为:

tomcat | Listening for transport dt_socket at address: 8000
从容器信息中,我假设端口已按其应该的方式映射:

CONTAINER ID        IMAGE       COMMAND      CREATED             STATUS              PORTS                                            NAMES
dcae1e0148f8        tomcat      "/run.sh"    8 minutes ago       Up 8 minutes        0.0.0.0:8000->8000/tcp, 0.0.0.0:8080->8080/tcp   tomcat
我的码头工人形象就是基于此

问题 当尝试运行远程调试配置(下面的屏幕截图)时,我收到错误
运行调试时出错:无法打开调试器端口(192.168.111.1:8000):java.net.ConnectException“连接被拒绝”
。我尝试了各种各样的配置,但没有成功。我错过什么了吗


您需要确保8080端口暴露给IntelliJ进行连接。也就是说,在运行docker时,您需要类似于
docker run-p8080:8080

例如,我可以通过执行下面提到的步骤/检查来达到类似的要求

这是我的docker run命令的外观:

sudo docker run --privileged=true -d -p 63375:63375 -p 63372:8080 -v /tmp/:/usr/local/tomcat/webapps/config <container name>:<tag>
sudo docker run--privileged=true-d-p 63375:63375-p 63372:8080-v/tmp/:/usr/local/tomcat/webapps/config:
注意:我在容器和主机上都暴露了一个额外的端口63375。下面是我在CATALINA_中使用的相同端口

这就是我的入口点(对于我正在构建的图像)的样子。注意:我使用的是CATALINA_选项。另外,我正在使用maven创建图像,因此下面的内容是从pom.xml中删除的

<entryPoint>
    <shell>cd /usr/local/tomcat/bin; CATALINA_OPTS="-agentlib:jdwp=transport=dt_socket,address=63375,server=y,suspend=n" catalina.sh run</shell>
</entryPoint>

cd/usr/local/tomcat/bin;CATALINA_OPTS=“-agentlib:jdwp=transport=dt_socket,地址=63375,服务器=y,挂起=n”CATALINA.sh run

尝试添加到Dockerfile

ENV JPDA_ADDRESS=8000
ENV JPDA_TRANSPORT=dt_socket

它适用于我

这是我用于此的命令:

docker run -it --rm \
  -e JPDA_ADDRESS=8000 \
  -e JPDA_TRANSPORT=dt_socket \
  -p 8888:8080 \
  -p 9000:8000 \
  -v D:/tc/conf/tomcat-users.xml:/usr/local/tomcat/conf/tomcat-users.xml \
  tomcat:8.0 \
  /usr/local/tomcat/bin/catalina.sh jpda run
解释

  • -e JPDA_ADDRESS=8000
    调试容器中的端口,作为环境变量传递
  • -e JPDA_TRANSPORT=dt_socket
    作为socket进行调试的传输类型,作为环境变量传递
  • -p 8888:8080
    将主机上的tomcat端口8080公开为端口8888
  • -p 9000:8000
    将主机上的java调试端口8000公开为端口9000
  • -v{host file}:{container file}
    用my local on覆盖tomcat-user.xml,因为我需要访问管理器api
    如果您的用例不需要这一行,请忽略这一行
  • tomcat:8.0
    参见
  • /usr/local/tomcat/bin/catalina.sh jpda run
    在容器中运行的命令

您始终可以将
Dockerfile
更新为以下内容:-

FROM tomcat:8-jre8
MAINTAINER me

ADD target/app.war /usr/local/tomcat/webapps/app.war

ENV JPDA_ADDRESS="8000"
ENV JPDA_TRANSPORT="dt_socket"

EXPOSE 8080 8000
ENTRYPOINT ["catalina.sh", "jpda", "run"]

这意味着您的docker文件在默认情况下已启用调试,这可能不适合生产环境。

我在本地环境中也有类似的设置。我将JPDA_ADDRESS作为环境变量包含在Dockerfile中,并重新创建了容器

ENV JPDA_ADDRESS 8000

#Expose port 8080, JMX port 13333 & Debug port 8000
EXPOSE 8080 13333 8000

CMD ["tail", "-f", "/dev/null"]  

我在使用docker compose时解决了一个类似的问题(如果不是相同的话)

它涉及到没有从docker-compose.yml文件正确传递环境变量


接受的答案对我不起作用,显然是因为我使用的是Java 11。如果您使用的是Java 9或更高版本,则需要如下指定JPDA地址:

JPDA_ADDRESS=*:8100

对我来说,这样更干净:

docker run -e JAVA_TOOL_OPTIONS="-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n" -p 8000:8000 tomcat:8.5-jdk8
这样,您就不必修改容器Dockerfile


说明:所有java版本检查事实部分中的java_TOOL_OPTIONS环境变量:

是容器信息,表明tomcat端口已正确公开。使用
lsof
命令,我检查了8000端口是否空闲。我相信JPDA_选项也像日志所建议的那样配置正确。谢谢你的尝试。你用来运行容器的docker命令是什么?这在这里很重要。我不确定你什么时候说港口是免费的,你的意思是说它是开放的,在听吗?另外,它是自由/开放的-在容器内部或在主机上(您可能正在运行intellij)运行容器?主机上的自由/开放端口:确保没有其他应用程序正在使用它。Tomcat容器与docker compose(以及其他容器)一起运行。端口在docker compose文件中公开。Run命令是默认的(从图像
catalina.sh jpda Run
)。我特别指docker Run命令
-p:part.
我使用docker compose,因此,在我的例子中没有docker Run命令。但是,
docker compose port
docker run-p
是相同的(8000:8000和8080:8080)。设置JPDA_地址对于在docker中执行此操作至关重要。Tomcat默认绑定本地主机而不是0.0.0.0,因此调试端口不能公开。@tstevens,yes,yes,yes。非常有用。更具体地说:-e JPDA_ADDRESS=0.0.0.0:8000对于JDK 9+,请参见下面的答案:。您需要
JPDA\u ADDRESS=*:
。谢谢,用openjdk:8u131 jre捕获了这个bug