Intellij Idea 在Docker容器中调试Tomcat

qacovj5a  于 2023-06-21  发布在  Docker
关注(0)|答案(8)|浏览(255)

我有一个CoreOS在Vagrant中运行。流浪者内网IP为192.168.111.1。CoreOS内部是一个带有Tomcat 8.0.32的Docker容器。几乎所有的东西都工作正常(应用程序部署等),只是调试没有。TomcatMap到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

从容器信息中,我假设端口按其应该的方式Map:

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

我的docker镜像就是基于这个Dockerfile

问题

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

wfypjpf4

wfypjpf41#

这是我使用的命令:

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

说明

  • 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运行 *

在容器中运行的命令

yrdbyhpb

yrdbyhpb2#

这个公认的答案对我不起作用,显然是因为我使用的是Java 11。如果你使用的是Java 9或更高版本,你需要像这样指定JPDA地址:

JPDA_ADDRESS=*:8100
sulc1iza

sulc1iza3#

您可以随时将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文件默认打开了debug,这可能不适合生产环境。

fae0ux8s

fae0ux8s4#

尝试添加到Dockerfile

ENV JPDA_ADDRESS=8000
ENV JPDA_TRANSPORT=dt_socket

对我很有效

xpszyzbs

xpszyzbs5#

您需要确保端口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>
jdgnovmf

jdgnovmf6#

我解决了一个类似的问题,如果不是相同的,当使用docker-compose。
它涉及到没有从docker-compose.yml文件正确传递环境变量。
查看我的堆栈溢出问题:

flseospp

flseospp7#

对我来说,这样更干净:

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

jjhzyzn0

jjhzyzn08#

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

相关问题