Docker容器内使用Arthas对java程序进行监听

1.使用docker ps 查看程序所在的容器id

2.使用 docker exec -it <containerId>  bash,containerId替换为自己的容器id

3.使用java -version 查看容器内的jdk版本

4.将下载好的arthas-boot.jar 从本地上传至宿主机后

再使用 docker cp 本机文件名  容器ID:容器内路径  将arthas-boot.jar复制进容器。

5.使用java -jar arthas-boot.jar 命令,显示如下报错

 6.经查是容器只有jre运行环境,因此重新上传jdk-8u391-linux-x64.tar.gz

7.解压上传的jdk-8u391-linux-x64.tar.gz,解压后使用解压文件夹下bin目录的java指令,提示报错

无法识别,实际bin目录下是有java指令的。

8.查看容器的os版本,使用cat /etc/os-release。显示系统版本是Alpine Linux。经过网上查阅,发现原因如下,总结下来就是使用musl libc是运行不了Oracle JDK的。

用Alpine跑了JDK8的镜像结果发现,JDK还是无法执行.后来翻阅文档才发现
Java是基于GUN Standard C library(glibc)
Alpine是基于MUSL libc(mini libc)

 9.解决方案就是需要自己下载glibc.apk包,可以选择版本进行下载,我下载的是glibc-2.29-r0.apk

地址:https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.29-r0/glibc-2.29-r0.apk

下载完成后又是一套先上传到宿主机服务器,再从主机拷贝到容器内。

10.安装glibc-2.29-r0.apk,使用 apk add glibc-2.29-r0.apk --no-network提示如下错误,

需要添加一个参数,添加后命令如下apk add glibc-2.29-r0.apk --no-network --allow-untrusted 

安装就成功了。

11.接着 使用 java -jar arthas-boot.jar 命令显示成功了。后续的arthas过程此文就不表述了。