在Docker容器中调试Tomcat

时间:2016-02-23 17:20:25

标签: 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配置为:

B = FOREACH A GENERATE MyUdf(name);

它以MyUdf命令开头。使用JDPA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000 运行时,控制台中的输出是:

catalina.sh jpda start

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

docker-compose

我的泊坞窗图片基于此Dockerfile

问题

尝试运行远程调试配置时(下面的屏幕截图)我收到错误tomcat | Listening for transport dt_socket at address: 8000 。我已经尝试过改变各种配置但没有运气的一切。我错过了什么吗?

enter image description here

8 个答案:

答案 0 :(得分:25)

这是我用于此的命令:

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
    用于调试作为套接字的传输类型,作为环境变量传递
  • -p 8888:8080 将主机上的tomcat端口8080暴露为端口8888
  • -p 9000:8000 在主机上公开java调试端口8000作为端口9000
  • -v {host-file}:{container-file}
    用我的本地打开tomcat-user.xml,因为我需要访问经理api
    如果您的用例不需要,则省略此行
  • tomcat:8.0
    请参阅https://hub.docker.com/_/tomcat/
  • /usr/local/tomcat/bin/catalina.sh jpda run
    在集装箱中运行的命令

答案 1 :(得分:3)

Try add to your Dockerfile

ENV JPDA_ADDRESS=8000
ENV JPDA_TRANSPORT=dt_socket

It works for me

答案 2 :(得分:3)

您始终可以将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文件默认启用了调试,这可能不适合生产环境。

答案 3 :(得分:1)

使用docker-compose时,我解决了类似的问题(如果不是相同的话)。

它涉及未从docker-compose.yml文件正确传递的环境变量。

See my stack overflow issue:

答案 4 :(得分:1)

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

JPDA_ADDRESS=*:8100

答案 5 :(得分:0)

您需要确保端口8080暴露给IntelliJ才能进行连接。这是在运行docker时你需要docker run -p 8080: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>

注意:我在容器和主机上都暴露了一个额外的端口63375。我在下面的CATALINA_OPTS中使用的相同端口。

这就是我的入口点(对于我正在构建的图像)。注意:我正在使用CATALINA_OPTS。另外,我正在使用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>

答案 6 :(得分:0)

我在本地环境中有类似的设置。我将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"]  

答案 7 :(得分:0)

对我来说,这样更清洁:

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环境变量:https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/envvars002.html