在Docker容器中调试Tomcat

CAP*_*OCK 20 debugging tomcat intellij-idea jpda

我有一个在Vagrant中运行的CoreOS.Vagrant专用网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
Run Code Online (Sandbox Code Playgroud)

它从catalina.sh jpda start命令开始.运行它时控制台中的输出docker-compose是:

tomcat | Listening for transport dt_socket at address: 8000
Run Code Online (Sandbox Code Playgroud)

从容器信息我假设端口按它们应该映射:

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
Run Code Online (Sandbox Code Playgroud)

我的docker镜像基于这个Dockerfile.

问题

尝试运行远程调试配置时(下面的屏幕截图)我收到错误Error running Debug: Unable to open debugger port (192.168.111.1:8000): java.net.ConnectException "Connection refused".我已经尝试过改变各种配置但没有运气的一切.我错过了什么吗?

在此输入图像描述

Pet*_*ter 30

这是我用于此的命令:

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
Run Code Online (Sandbox Code Playgroud)

说明

  • -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}
    用我的本地on覆盖tomcat-user.xml,因为我需要访问管理器api
    omit this line如果你的用例不需要
  • tomcat:8.0
    https://hub.docker.com/_/tomcat/
  • /usr/local/tomcat/bin/catalina.sh jpda run
    命令在容器中运行

  • 设置JPDA_ADDRESS对于在docker中进行此操作至关重要.Tomcat默认绑定到localhost而不是0.0.0.0,因此无法公开调试端口. (3认同)
  • 对于 JDK 9+,请参阅以下答案:/sf/answers/3902167461/。您需要“JPDA_ADDRESS=*:<PORT>”。 (3认同)
  • @tstevens,是的,是的,是的。很有帮助。更具体地说:-e JPDA_ADDRESS=0.0.0.0:8000 (2认同)

Seb*_*amp 10

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

JPDA_ADDRESS=*:8100
Run Code Online (Sandbox Code Playgroud)


bob*_*sie 7

您可以随时将其更新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"]
Run Code Online (Sandbox Code Playgroud)

这确实意味着,尽管您的docker文件默认情况下处于调试状态,这可能不适合生产环境。