开发工具使用 August 24, 2020

使用IDEA远程Debug在Docker中的Java应用

Words count 4k Reading time 4 mins. Read count 0

今天在工作中遇到了一个问题,Flink应用在本地开发测试都没有问题,打成镜像放到Docker中提交就报空指针异常,日志很少,不太容易定位问题,于是想到了远程Debug,从IDEA官网查阅了相关文档,折腾了一上午终于找出了问题。下面将从创建项目、构建镜像、发布应用、远程调试一步一步进行详细讲解。

官网地址:https://www.jetbrains.com/help/idea/debug-a-java-application-using-a-dockerfile.html

原理其实很简单,在启动docker容器执行Java程序的时候,给JVM添加debug相关的参数,暴露可以远程debug的端口号,IDEA添加远程调试,通过暴露的端口号进行调试。

1 创建项目

1.1 创建一个简单的Maven项目

执行如下命令,创建Maven项目

mvn archetype:generate -DgroupId=learn.demo -DartifactId=idea-remote-debug-dockerapp -Dversion=1.0 -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false 

1.2 IDEA导入Maven项目

使用IDEA导入上面创建的项目。

1.3 创建一个简单的Java应用

在App类下,创建main方法,并获取本机IP,代码如下:

/**
 * 演示应用
 *
 * @author shirukai
 */
public class App {
    public static void main(String[] args) throws UnknownHostException {
        // 获取本机IP
        InetAddress addr = InetAddress.getLocalHost();
        System.out.print(addr.getHostAddress());
    }
}

2 使用Dockerfile创建docker应用

2.1 编写Dockerfile

在项目根目录下创建一个名为Dockerfile的文件,内容如下:

FROM openjdk:8
WORKDIR /idea-remote-debug-dockerapp

# copy server files
COPY target/idea-remote-debug-dockerapp-1.0.jar .

2.2 添加启动Dockerfile的Configuration

  1. 在工具栏选择【Add Configuration】

  2. 点击右上角【+】在【Docker】一栏选择【Dockerfile】

  3. 填写Configuration

    分别填写如下信息name、Dockefile位置、Image tag、Container name、Command

  4. 打包项目并执行测试

    先试用Maven打包一个Jar,然后执行刚才我们创建的configuration。

    有以下日志输出,说明我们的Java应用在Docker容器中成功运行了

3 创建远程调试的Configuration

  1. 步骤与2类似,在工具栏选择【Add Configuration】,点击右上角【+】选择【Remote】,自定义Configuration的name

  2. Before launch点击【+】选择 Launch Docker before debug.

  3. Docker configuration一栏选择我们在2中创建的configuration

  4. 点击【OK】

4 设置断点进行远程调试

现在我们就可以跟在本机测试一样,在代码需要调试的地方,设置断点,然后debug我们在3中创建的configuration。

0%