[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的就是我们的应用启动进程
此时执行jstack 1 出现如下错误
```
1: Unable to get pid of LinuxThreads manager thread
```
解决办法
因为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的效果如下
可以看到我们的java进程号是6,之后就可以用jstack和jmap对我们的应用进行分析了
- 大小: 27.4 KB
- 大小: 10.6 KB
- 大小: 26.9 KB
- 大小: 142.6 KB
分享到:
相关推荐
Kubernetes 应用 Java 程序无法使用 jmap, jstack 的...总结:本文解决了 Kubernetes 环境中 Java 程序无法使用 jmap 和 jstack 命令的解决方案,通过修改 Dockerfile,使用 tini 进行 Java 程序的启动,解决了问题。
本文介绍了Docker如何进入启动容器,分享给大家,具体如下: 在使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。 这个时候如果需要进入容器进行操作,有多种方法,包括使用官方的...
在IT行业中,微服务架构已经成为了现代应用开发的主流趋势,Spring Boot、Spring Cloud和Docker作为其中的关键技术,各自扮演着重要的角色。本实战指南将深入探讨这三者的使用和整合,帮助开发者构建高效、可扩展的...
Docker Compose 文件可以存储应用程序的容器配置信息、依赖关系和启动命令等信息。使用 Docker Compose 文件可以帮助开发者快速定义和部署多容器应用程序。 本篇文章详细讲解了如何使用 SpringCloudAlibaba 框架...
而unless-stopped策略仅在容器正常停止时才会应用重启行为,如果容器是通过docker stop命令被停止的,则不会重启。 了解Docker的重启策略对排查容器无法停止的问题很有帮助。如果确实需要修改容器的重启策略,可以...
将Spring boot应用打包成镜像放到docker中运行: https://blog.csdn.net/anla_/article/details/79943251
docker 容器的生命周期是同容器中的前置进程相关在一起的,这也是我们平时可能会遇到一些容器只是运行几秒便自动结束的原因:因为容器中没有一个常驻的前置进程,前置进程运行结束后,容器便自动退出了。 比如 ...
Docker 容器中 Tomcat 部署...在 Dockerfile 中添加环境变量 ENV LC_ALL en_US.UTF-8,然后重新构建 Docker 镜像和启动容器即可解决问题。同时,我们也需要注意在 Docker 容器中设置 locale 的重要性,以避免各种问题。
在本节总结中,我们将详细介绍 Docker 容器技术的基本概念、优点、架构、Namespace 和 Cgroup 等关键技术点,并总结 Docker 容器技术在实际应用中的价值。 容器技术解决了环境依赖问题,实现了跨平台分发使用。...
Boot2Docker是一款轻量级的Linux发行版,专为在Docker容器上运行而设计。它的主要目的是提供一个简单、快速的方式来运行Docker主机,尤其适合开发者在本地环境中进行Docker开发和测试。这个v18.02.0-ce版本是Boot2...
本书根据Docker 1.10版和Kubernetes 1.2版对第1版进行了全面更新,从实践者的角度出发,以Docker和Kubernetes为重点,沿着“基本用法介绍”到“核心原理解读”到“高级实践技巧”的思路,一本书讲透当前主流的容器和...
它自动处理了网络设置、磁盘挂载等复杂问题,让用户可以专注于Docker容器的管理和应用开发。 6. **版本管理**: Docker的版本更新频繁,每个版本可能引入新的功能、修复错误或者提升性能。v19.03.5是一个重要的稳定...
Docker 容器技术的核心是 Docker 守护进程,它负责管理 Docker 容器的生命周期,包括创建、启动、停止和删除。 相比虚拟机技术,Docker 容器技术有以下优点: 1. 启动速度快:Docker 容器可以在数秒内启动,而...
Spring Cloud为微服务间的通信、配置管理和服务发现等问题提供了一套完善的解决方案,而Docker则在服务的部署和运行方面提供了极大的便利。 Spring Cloud是一组由Pivotal公司提供的工具集合,旨在简化分布式系统...
开发提升十倍生产力- IDEA 远程一键部署 Spring Boot 到 Docker.zip开发提升十倍生产力- IDEA 远程一键部署 Spring Boot 到 Docker.zip开发提升十倍生产力- IDEA 远程一键部署 Spring Boot 到 Docker.zip开发提升十...
该项目以名为Anime Hub的博客Web应用程序的形式演示了Spring Boot、Spring Security、Spring mvc、Docker容器的实现.zip
主要介绍了详解如何将Spring Boot应用跑在Docker容器中,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
虽然也可以通过进程监控的方式(如systemd)来完成这种动作,但Docker还是建议尽量避免使用进程监控的方式来 “自启动” 容器。 Docker的 Restart policy与dockerd命令的–live-restore启动标志还有区别:–live-...