远程调试Spring Boot应用程序

4

我有一个使用Spring Boot制作的简单(docker化)Web应用程序。

该应用程序已经成功编译。 容器构建没有错误。 该应用程序在localhost:8080上正常运行,它只是一个简单的“Hello World”。

现在,我正在尝试使用远程调试将Spring Tool Suite调试器附加到容器化的JVM上,但没有成功。

错误消息为:

Failed to connect to remote VM com.sun.jdi.connect.spi.ClosedConnectionException

这是我的Dockerfile文件:
FROM openjdk:8-alpine
WORKDIR /
EXPOSE 8080 8000
COPY target /

这是我的docker-compose.yml文件

version: '3.7'
services:
  web:
    build: .
    ports:
      - "8080:8080"
      - "8000:8000"
    command: java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=127.0.0.1:8000 -jar gs-spring-boot-docker-0.1.0.jar

在Spring Tool Suite中,我有以下用于远程调试的设置:
Remote Java Application
- Connection type: Standard (Socket attach)
- Host: localhost
- port: 8000

我使用带有OSX Mojave(10.14.6)的Macbook Pro。感谢您提供任何建议。

尝试使用address=8000 - Michał Krzywański
1个回答

11

简述:

错误的部分是 address=127.0.0.1:8000,正确应该是 0.0.0.0:8000

Docker Compose 中的完整命令:

command: java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:8000 -jar gs-spring-boot-docker-0.1.0.jar

长回答:

每个容器都有自己的网络接口,记住 127.0.0.1 表示回环接口,仅能从同一主机访问(即如果您在容器内部,则可以访问它)。

相反,如果您希望应用程序侦听可用的每个网络接口,我们可以将其替换为 0.0.0.0,在我们的情况下,这正是我们想要的,因为我们正在从容器外部连接到调试端口,该端口位于容器内部的8000上,因此回环接口不足够。


是的!在其他地方,我看到这个地址是address=*:8000,至少在docker-compose上下文中不起作用...值得注意的是,您可能会看到类似“调试器无法附加:握手失败-连接过早关闭”的日志消息。起初,我以为这意味着连接已经断开或Tomcat放弃了什么,但是能够连接调试器并且一切似乎都正常启动,所以不要担心那条消息! - Spanky Quigman
哇,你的评论刚刚拯救了另一个可怜的灵魂(我的),让我免于为使用“127.0.0.1”而进行无数小时的烦恼排查。非常感谢您! - dian jin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接