远程调试Docker容器内的Java进程
背景
开发环境无法复现测试的问题,尝试去远程调试测试环境docker容器内的java进程。
具体实现
Docker容器配置和启动
我这边简单搭建了一个Spring Boot项目和本地构建了一个Docker环境作为验证。只提供了一个HTTP接口
/**
* 启动类
*
* @author yuanzhihao
* @since 2024/4/12
*/
@RestController
@RequestMapping
@SpringBootApplication
public class Application {
@GetMapping("/hello/{name}")
public String hello(@PathVariable("name") String name) {
return "Hello " + name;
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
首先需要在Java进程启动的时候,添加如下启动参数
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
参数的具体含义
构建镜像的Dockerfile文件参考如下
FROM openjdk:8-jdk-alpine
WORKDIR /data
COPY ./target/docker-debug-1.0-SNAPSHOT.jar /data/docker-debug-1.0-SNAPSHOT.jar
ENTRYPOINT java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar docker-debug-1.0-SNAPSHOT.jar
在IDEA中配置Docker环境,配置参考如下,这边需要把服务的端口和Debug的端口都开出来
之后启动容器,访问localhost:8080/hello/{{name}}正常
本地调试
在idea新增一个Remote JVM Debug,配置如下
- 填入远端服务器的ip和调试端口,我是本地启动的,所以填的localhost
- 添加启动参数 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
- 选择需要调试的源码模块
启动之后,浏览器请求localhost:8080/hello/{{name}},可以进入debug程序,配置完毕
结语
参考:https://www.baeldung.com/docker-debug-app-with-intellij
代码地址:https://github.com/yzh19961031/blogDemo/tree/master/docker-debug