28

我有一个在 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

它从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

我的 docker 映像基于此Dockerfile

问题

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

在此处输入图像描述

4

8 回答 8

38

这是我为此使用的命令:

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
    命令在容器中运行
于 2016-11-20T14:52:03.473 回答
11

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

JPDA_ADDRESS=*:8100
于 2019-04-18T11:39:52.947 回答
9

您始终可以将其更新为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 文件默认已调试,这可能不适合生产环境。

于 2016-11-25T12:00:56.500 回答
4

尝试添加到您的 Dockerfile

ENV JPDA_ADDRESS=8000
ENV JPDA_TRANSPORT=dt_socket

这个对我有用

于 2016-07-11T19:22:47.517 回答
1

我在使用 docker-compose 时解决了一个类似的问题,如果不一样的话。

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

查看我的堆栈溢出问题:

于 2017-07-29T00:48:18.983 回答
1

对我来说这样更干净:

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

于 2019-06-24T07:43:34.703 回答
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>
于 2016-03-03T11:50:45.623 回答
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"]  
于 2017-05-03T02:14:02.793 回答