【问题标题】:Remote debug Spring Boot application远程调试 Spring Boot 应用程序
【发布时间】:2020-03-18 13:51:09
【问题描述】:

我在 Spring Boot 中有一个简单的(dockerized)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

标签: java spring spring-boot docker remote-debugging


【解决方案1】:

tl;博士:

不正确的部分是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所以loopback接口不够用。

【讨论】:

  • 是的!在其他任何地方,我都将其视为 address=*:8000,这至少在 docker-compose 上下文中不起作用……值得注意的是,您可能会看到一条日志消息,例如“调试器无法附加:握手失败 - 连接过早关闭”。起初我以为这意味着连接已死或 Tomcat 放弃或其他什么,但能够连接调试器并且一切似乎都正常启动,所以不要担心那个消息!
猜你喜欢
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
相关资源
最近更新 更多