容器中Java应用PID为1的问题
条评论容器中Java应用PID为1的问题
背景
Dockerfile中如果通过ENTRYPOINT 直接执行java -jar命令,会发现在容器中的java进程id是1,这样无法通过jstack,jmap,jinfo查看JVM相关信息。
- PID 1~5是Linux的特殊进程。
| pid | 描述 |
|---|---|
| 1 | init进程,系统启动的第一个用户级进程,是其他所有进程的父进程,引导用户空间服务 |
| 2 | kthreadd,内核线程管理 |
| 3 | migration,用于进程在不同CPU间迁移 |
| 4 | ksoftirqd,内核中软中断守护线程,用于系统空闲时定时处理软中断事务 |
| 5 | watchdog,看门狗进程,用于监听内核异常,当系统出现宕机时,可利用watchdog记录宕机时堆栈信息 |
Dockerfile配置:
1 | 环境 |
- 容器中查询 app.jar pid 为 1
1 | / # export LINES=32; export COLUMNS=142 |
方案
避免java应用作为第一个启动的应用。添加tini,作为第一个启动的应用。
- 运行apk add –no-cache tini
- 添加tini作为第一个运行的参数[“tini”, “java”, “-jar”, “app.jar”, “&”]
Dockerfile配置
1 | 环境 |
- 容器中查询 app.jar pid 为 7
1 | / # export LINES=32; export COLUMNS=142 |
其他方案
除了使用tini来解决外,通过sh简单再开一个子进程也是可以的:
写好run.sh脚本放到项目中:
1 | !/bin/sh |
- 修改dockerfile:
1 | COPY ./target/$app.jar /tmp |
本文标题:容器中Java应用PID为1的问题
文章作者:fantasykai
发布时间:2023-04-07
最后更新:2025-02-11
原始链接:http://ai.mak.cn/posts/22867/
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!