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