java - 远程调试 Spring Boot 应用程序

标签 java spring spring-boot docker remote-debugging

我在 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 感谢您的任何建议。

最佳答案

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

长答案:

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

相反,如果您希望应用程序监听每个可用的网络接口(interface),我们可以将其与 0.0.0.0 交换,这在我们的例子中就是我们想要的,因为我们是从外部连接的容器到容器内的调试端口为8000,所以环回接口(interface)不够。

关于java - 远程调试 Spring Boot 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58995110/

相关文章:

java - Jersey-Spring3 maven依赖问题

java - 努力理解Spring MVC模型和具体的 Controller 方法

java - spring + Velocity如何处理开发和生产之间的URL?

java - Spring JPA,@JointTable 注释不起作用

java - NamedParameterJdbcTemplate 不替换值?

java - 使用正则表达式检查特定字符串

java.lang.String 无法转换为 JSONObject

java - 避免将 Spring Framework 特定服务显示为 Swagger 界面的一部分

java - Spring Security 按用户进行身份验证

java - 从Spring App(docker-compose)在Mongodb连接上获取 “Exception opening socket”