在docker中调试spring-boot

Jar*_*sen 13 java spring docker spring-boot

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

java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n -jar app.jar
Run Code Online (Sandbox Code Playgroud)

对于docker我在docker-compose上暴露这些端口:

ports:
- "8080:8080"
- "8000:8000"
Run Code Online (Sandbox Code Playgroud)

但是,调试器无法在端口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
Run Code Online (Sandbox Code Playgroud)

nek*_*739 11

我必须意识到在dockerFile中,Expose命令只执行一半的工作,这意味着只暴露docker内部的端口,而不是外部,在您的示例中,结果将如下所示:

在此输入图像描述

Debug与JAVA_OPTS和远程调试一起使用,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" ]
Run Code Online (Sandbox Code Playgroud)

并执行此命令:

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
Run Code Online (Sandbox Code Playgroud)

如您所见,在运行期间,您应该在我的案例(eclipse)8000中公开调试端口

在此输入图像描述

在此输入图像描述


SWi*_*els 8

嗨,我遇到了同样的问题.

我将以下内容添加到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"]
Run Code Online (Sandbox Code Playgroud)

我没有Expose在Dockerfile中移植8000.

希望这可以帮助.


Pal*_*jan 0

我认为原因可能是,您的 Virtual Box VM 配置没有将调试端口隧道连接到主机。

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

基本上,就您的情况而言,您必须命令提示符并运行

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

注意:确保 VBoxManage 在您的 PATH 中