通过jad/mc/redefine命令,在docker容器中实现动态更新代码的功能:
demos_dockerfile:
from openjdk:8u232-jdk
maintainer czm<chengzhiming06@163.com>
add demo-0.0.1-SNAPSHOT.jar demo.jar
WORKDIR /app
COPY ./demo-0.0.1-SNAPSHOT.jar demo.jar
VOLUME /tmp
EXPOSE 8080
ENTRYPOINT ["java","-jar","demo.jar"]
通过dockerfile构建镜像:docker build -f ./demos_dockerfile -t (镜像名称)demo .
通过镜像构建容器:docker run -di --name (镜像名称)demo -p 8080:8080 (容器名称)demo
查看容器日志:docker logs -f --tail=100 (id或者name名称)a484ddc601e3
进入容器:docker exec -it (id或者name名称)a484ddc601e3 /bin/bash
在容器中使用arthas,5步操作:
一: 拉取jar包并监控:wget https://arthas.aliyun.com/arthas-boot.jar
二: 使用jad命令编译:jad --source-only com.example.demo.arthas.user.TestController > /tmp/TestController.java
--如果遇到执行失败,在确保执行路径没有问题的前提下,可尝试推出arthas,然后重试即可
三: 编辑文件:vim /tmp/TestController.java(注意该执行是在容器中执行,不是在arthas中执行)
--如果遇到无法执行vim命令,解决办法是:
1)从本地windows服务编辑后上传到linux服务器指定位置
2)执行apt-get install vim -y && apt-get update
四: 反编译文件到指定目录:mc /tmp/TestController.java -d /tmp
--如果遇到mc命令执行失败,解决办法是:
1)从本地借助像ideal工具,反编译好之后,上传到linux服务器指定位置,或者按如下操作
1)将{jdk}/lib下的tool.jar文件复制到{jdk}/jre/lib
2)进入jre/bin目录,用java.exe -jar xx分别启动应用和arthas
五: 将修改之后的文件编译到内存中:redefine /tmp/TestController.class
注意:该操作只能在docker容器中运行,无法通过远程浏览器访问,若要实现windows远程访问,有需要后续会继续更新。