今天在工作中遇到了一个问题,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
在工具栏选择【Add Configuration】
点击右上角【+】在【Docker】一栏选择【Dockerfile】
填写Configuration
分别填写如下信息name、Dockefile位置、Image tag、Container name、Command
打包项目并执行测试
先试用Maven打包一个Jar,然后执行刚才我们创建的configuration。
有以下日志输出,说明我们的Java应用在Docker容器中成功运行了
3 创建远程调试的Configuration
步骤与2类似,在工具栏选择【Add Configuration】,点击右上角【+】选择【Remote】,自定义Configuration的name
在Before launch点击【+】选择 Launch Docker before debug.
在Docker configuration一栏选择我们在2中创建的configuration
点击【OK】
4 设置断点进行远程调试
现在我们就可以跟在本机测试一样,在代码需要调试的地方,设置断点,然后debug我们在3中创建的configuration。