Docker+arthas排查线上问题
在dockerfile配置文件新增:
# copy arthasCOPY --from=hengyunabc/arthas:latest /opt/arthas /opt/arthas
进入到docker容器中执行以下命令:
find -name "arthas"
java -jar arthas-boot.jar
并选择对应的java进程序号:那么就输入:1。选择后,arthas完成启动,并打印以下信息:

修改java文件
1、找到对应的类并反编译。
比如下面我们需要在HandlerController这个类添加一些日志,那么需要找到对应的包路经然后,反编译到docker容器内的/tmp文件夹下,执行命令:
jad --source-only com.speakin.controller.HandlerController > /tmp/HandlerController.java
执行成功后,对应的java文件就会出现在docker容器的/tmp目录下了。这时候,我们需要另开一个会话窗口在容器内进行操作
2、编辑对应的类。
把代码拷贝到容器外面进行修改:
新建一个服务器的回话窗口,并把对应容器id的对应java文件拷贝到当前用户目录下:
sudo docker cp [容器id]:/tmp/ HandlerController.java ~
# 编辑文件
vim ~/ HandlerController.java

修改完成后,再把文件拷贝回容器内:
sudo docker cp ~/ HandlerController.java [容器ID]:/tmp/ HandlerController.java
3、寻找对应的类加载器【我们后面编译的时候需要用到】
执行命令,查看对应类的类加载器的hash
sc -d * HandlerController | grep classLoaderHash
列出所有类加载器的hash:

可以看到对应的类加载器就是:LaunchedURLClassLoader
4、通过mc命令进行内存编译
mc --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader /tmp/HandlerController.java -d /tmp
5、再使用redefine 重新加载对应的class文件
redefine /tmp/com/speakin/controller/HandlerController.class

!!!注意:服务重启,修改内容失效
