在docker中debuggingspring-boot

出于某种原因,我将远程debugging连接到docker中运行的spring-boot应用程序时遇到问题。 我启动Java应用程序:

java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n -jar app.jar 

对于docker工人,我在docker-compose上公开这些端口:

 ports: - "8080:8080" - "8000:8000" 

但是,debugging器无法在端口8000上连接。当我在本地运行服务器,但不在docker内时,它起作用。 任何想法为什么?

Docker ps输出:

 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0d17e6851807 pocmanager_manager:latest "/bin/sh -c 'java -D 3 seconds ago Up 2 seconds 0.0.0.0:8000->8000/tcp, 0.0.0.0:8080->8080/tcp pocmanager_manager_1 35ed2e2c32bc redis:latest "/entrypoint.sh redi 14 seconds ago Up 13 seconds 0.0.0.0:6379->6379/tcp pocmanager_redis_1 

嗨,我面临同样的问题。

我将以下内容添加到Dockerfile中的入口点:

“-agentlib:JDWP = =运输dt_socket,地址= 8000,服务器= Y,暂停= N”

现在看起来像这样:

 FROM java:8 VOLUME /tmp ADD realName*.jar app.jar EXPOSE 4786 RUN sh -c 'touch /app.jar' ENTRYPOINT ["java","-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] 

我没有在Dockerfile中Expose 8000端口。

希望这可以帮助。

我必须认识到,在dockerFile中,Expose命令只做了一半的工作,这意味着只显示Docker内部的端口,而不是外部的,在你的例子中结果将是这样的:

在这里输入图像说明

debugging工作与JAVA_OPTS和远程debugging,dockerFile看起来像这样:

 FROM frolvlad/alpine-oraclejdk8:slim VOLUME /tmp ADD gs-spring-boot-docker-0.1.0.jar app.jar RUN sh -c 'touch /app.jar' ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -jar /app.jar" ] 

并执行这个命令:

 docker run -e "JAVA_OPTS=-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=y" -p 8080:8080 -p 8000:8000 -t springio/gs-spring-boot-docker 

正如你所看到的,你应该在运行期间暴露debugging端口,在我的情况下(eclipse)8000

在这里输入图像说明

在这里输入图像说明

我认为这样做的原因可能是,您的Virtual Box虚拟机configuration不会将debugging端口传送到主机。

检查这个链接https://github.com/boot2docker/boot2docker/blob/master/doc/WORKAROUNDS.md

基本上,在你的情况下,你必须命令提示符并运行

VBoxManage modifyvm "boot2docker-vm" --natpf1 "tcp-port8000,tcp,,8000,,8000";

注意:确保VBoxManage在你的PATH中