欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

解决spring boot应用以docker容器方式启动后,进程ID是1而导致的jstack和jmap等命令不可用的问题 博客分类: dockersprng boot docker spring-boot 

程序员文章站 2024-03-22 22:39:10
...
[TOC]
目的
解决spring boot应用以docker容器方式启动后,进程ID是1而导致的jstack和jmap等命令不可用的现象 

默认将spring boot工程打包成镜像的方式
1. 当我们把spring boot打包成一个可执行jar
2. 编写Dockerfile 将jarcopy到容器中,在cmd 中执行java -jar ***.jar 启动,Dockerfile文件如下


#基础镜像基于openjdk,利用alpine
FROM openjdk:8u212-jdk-alpine
#所属团队
MAINTAINER chengf

ENV JAVA_OPTS="-server -Xms512m -Xmx512m" LOGGING_LEVEL="INFO"
#编译时变量无法在运行时用,此处做一次转换
ENV TARGET_JAR="spring-boot-sample-0.0.1-SNAPSHOT.jar"

#将编译好的工程jar包copy到镜像容器中
COPY ${TARGET_JAR} /usr/src/${TARGET_JAR}


ENV OPTS=${JAVA_OPTS}" -Dfile.encoding=UTF8    -Duser.timezone=GMT+08"
WORKDIR /usr/src
#程序入口


CMD java -jar ${OPTS} ${TARGET_JAR} --logging.level.root=${LOGGING_LEVEL}


启动镜像后执行docker exec 进入到容器内部,执行ps可以看到容器中进程号是1的就是我们的应用启动进程

解决spring boot应用以docker容器方式启动后,进程ID是1而导致的jstack和jmap等命令不可用的问题  
            
    
    博客分类: dockersprng boot docker spring-boot 



此时执行jstack 1 出现如下错误

```
1: Unable to get pid of LinuxThreads manager thread
```

解决spring boot应用以docker容器方式启动后,进程ID是1而导致的jstack和jmap等命令不可用的问题  
            
    
    博客分类: dockersprng boot docker spring-boot 


解决办法
因为jstack jmap等jdk自带的tools放发无法对1号进程分析,那我们就想办法把java进程变为非1号进程对应的Dockerfile


#基础镜像基于openjdk,利用alpine
FROM openjdk:8u212-jdk-alpine
#所属团队
MAINTAINER chengf

ENV JAVA_OPTS="-server -Xms512m -Xmx512m" LOGGING_LEVEL="INFO"
#编译时变量无法在运行时用,此处做一次转换
ENV TARGET_JAR="spring-boot-sample-0.0.1-SNAPSHOT.jar"

#将编译好的工程jar包copy到镜像容器中
COPY ${TARGET_JAR} /usr/src/${TARGET_JAR}


ENV OPTS=${JAVA_OPTS}" -Dfile.encoding=UTF8    -Duser.timezone=GMT+08"
WORKDIR /usr/src
#程序入口


#CMD java -jar ${OPTS} ${TARGET_JAR} --logging.level.root=${LOGGING_LEVEL}

RUN echo "java -jar \${OPTS} \${TARGET_JAR} --logging.level.root=\${LOGGING_LEVEL}" > start.sh \
             && chmod 777 start.sh
CMD ./start.sh



这样启动后1号进程就变成了 start.sh 由1号进程启动的进程才是我们的java进程,启动后通过docker exec 进入到容器中执行ps的效果如下

解决spring boot应用以docker容器方式启动后,进程ID是1而导致的jstack和jmap等命令不可用的问题  
            
    
    博客分类: dockersprng boot docker spring-boot 



可以看到我们的java进程号是6,之后就可以用jstack和jmap对我们的应用进行分析了

解决spring boot应用以docker容器方式启动后,进程ID是1而导致的jstack和jmap等命令不可用的问题  
            
    
    博客分类: dockersprng boot docker spring-boot 
  • 解决spring boot应用以docker容器方式启动后,进程ID是1而导致的jstack和jmap等命令不可用的问题  
            
    
    博客分类: dockersprng boot docker spring-boot 
  • 大小: 27.4 KB
  • 解决spring boot应用以docker容器方式启动后,进程ID是1而导致的jstack和jmap等命令不可用的问题  
            
    
    博客分类: dockersprng boot docker spring-boot 
  • 大小: 10.6 KB
  • 解决spring boot应用以docker容器方式启动后,进程ID是1而导致的jstack和jmap等命令不可用的问题  
            
    
    博客分类: dockersprng boot docker spring-boot 
  • 大小: 26.9 KB
  • 解决spring boot应用以docker容器方式启动后,进程ID是1而导致的jstack和jmap等命令不可用的问题  
            
    
    博客分类: dockersprng boot docker spring-boot 
  • 大小: 142.6 KB
相关标签: docker spring-boot