Docker容器中启动Arthas异常

使用Docker容器部署spring boot项目
Dockerfile文件内容如下

FROM openjdk:8-jre-alpine

#第一步将apk源替换为国内阿里源。没有第一步将下载难产
RUN echo -e 'https://mirrors.aliyun.com/alpine/v3.6/main/\nhttps://mirrors.aliyun.com/alpine/v3.6/community/' > /etc/apk/repositories \
    && set -xe \
    && apk --no-cache add ttf-dejavu fontconfig

#创建文件夹
RUN mkdir -p /work

WORKDIR /work

ARG JAR_FILE=app.jar

COPY ${JAR_FILE} app.jar

EXPOSE 80

ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms128m -Xmx256m -Djava.security.egd=file:/dev/./urandom"

CMD java -jar app.jar $JAVA_OPTS

使用build命令生成镜像并运行

docker build -t app .
docker run -d -p 8080:8080 --name app app

在Docker容器启动Arthas

docker exec -it a05430507a7d /bin/sh
wget https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar

遇到问题:Can not find java process. Try to run jps command lists the instrumented Java HotSpot VMs on the target system.
jre-alpine默认没有安装jps,无法通过jps查找java进程

直接指定进程号:
java -jar arthas-boot.jar 1
再次遇到问题:Exception in thread "main" java.lang.IllegalArgumentException: Can not find tools.jar under java home: /usr/lib/jvm/java-1.8-openjdk/jre, please try to start arthas-boot with full path java. Such as /opt/jdk/bin/java -jar arthas-boot.jar
因为jre-alpine中没有tools.jar文件

找一个linux版本java中的tools.jar文件,拷贝到容器中
docker cp /data/tools.jar ac69a820acf6d71://usr/lib/jvm/java-1.8-openjdk/lib

再次启动arthas
java -jar arthas-boot.jar 1
遇到问题:com.sun.tools.attach.AttachNotSupportedException: Unable to get pid of LinuxThreads manager thread
因为Docker与Open JDK之间存在bug,java应用做为进程pid值为1时,会出现这个问题

解决方式:

  1. 在Dockerfile中引入tini,由它管理进程
ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms128m -Xmx256m -Djava.security.egd=file:/dev/./urandom"

RUN apk --update --no-cache add tini
ENTRYPOINT ["tini"]

CMD java -jar app.jar $JAVA_OPTS
  1. 从linux版本的jre/lib中,拷贝tools.jar到容器中
docker build -t app .
docker run -d -p 8080:8080 --name app app

docker exec -it a05430507a7d /bin/sh
wget https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar

docker cp /data/tools.jar ac69a820acf6d71://usr/lib/jvm/java-1.8-openjdk/lib
docker exec -it ac69a820acf6d71 /bin/sh
wget https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar

相关文章:
Alpine镜像中执行jstack、arthas等命令提示Unable to get pid of LinuxThreads manager thread
在Docker中使用Arthas诊断
在docker中使用arthas

你可能感兴趣的:(JAVA,docker,java,容器)