1.本发明涉及软件运维技术领域,具体涉及一种规避容器中僵尸进程的方法。
背景技术:2.容器是通过一种虚拟化技术来隔离运行在主机上不同进程,从而达到进程之间、进程和宿主操作系统相互隔离、互不影响的技术。容器化后,由于单容器单进程,已经没有传统意义上的 init 进程了。应用进程直接占用了 pid 1 的进程号。从而导致以下两个问题:a:常见的使用是 docker run my-container script 。给 docker run进程发送sigterm 信号会杀掉 docker run 进程,但是容器还在后台运行。
3.b:如果父进程在子进程之前退出,子进程会变成孤儿进程, 它的父进程会变成 pid 1。因此,init进程就要对这些进程负责,并在适当的时候调用 wait() 方法。通常情况下,大部分应用进程不会处理偶然依附在自己进程上的随机子进程,所以在容器中,会出现许多僵尸进程。
技术实现要素:4.本发明解决的技术问题是:克服了使用dumb-init的方式解决了容器在运行过程中,销毁等情况下出现宿主主机很多僵尸进程问题的缺点,提供了一种规避容器中僵尸进程运维问题的方法及系统。
5.本发明的目的是通过以下技术方案来实现的:一种规避容器中僵尸进程的方法,包括以下步骤:使用流水线构建image容器镜像;容器镜像编译;镜像的entrypoint启动参数设置,使进程启动顺序为首先启动dumb-init进行作为系统pid为0的父进程,后续业务应用进程直接被dumb-init守护进程接管,业务子进程的销毁和新建都由父进程统一处理,以彻底预防容器化应用出现僵尸进程。
6.具体的,所述image容器镜像构建,包括以下子步骤:base基础镜像:base基础镜像中存放dump-init进程控制二进制程序,该程序主要充当linux操作系统中的supervisor和init system并且运行时以pid1在容器中运行,业务容器所有进程均有该进程控制;业务基础镜像构建:在第二阶构建业务image镜像时,从第一阶段base基础镜像中复制dump-init二进制执行文件,并存放在当前业务基础镜像的寄存目录下,并进行可执行授权;业务应用镜像endponits:在业务镜像的dockerfile中,业务容器的启动endponits基于语法规则添加dump-init启动参数。
7.具体的,所述容器镜像编译,包括以下子步骤:
编译基础镜像,将代码从代码仓库下载,并下载相关依赖库文件安装;设置编译环境变量,使得在编译之后的制品中注入有效环境信息,用于后期该镜像容器化启动需要和安全类加固。
8.具体的,所述entrypoint启动参数设置的命令式为:entrypoint ["/usr/bin/dumb-init", "", "/main"]。
[0009]
具体的,所述业务基础镜像的寄存目录具体是/usr/local/bin。
[0010]
具体的,所述的语法规则包括json语法。
[0011]
本发明的有益效果:本发明利用linux进程管理机制,使用dumb-init的方式解决了容器在运行过程中,销毁等情况下出现宿主主机很多僵尸进程问题,从而导致资源浪费,尤其pid进程号的耗尽。同时采用dockerfile多阶构建,有效缩减业务容器镜像大小,更加充分利用计算资源用于业务应用。
附图说明
[0012]
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图示出的结构获得其他的附图。
[0013]
图1是本发明的流程图;图2是本发明的系统模块结构图。
具体实施方式
[0014]
应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
[0015]
为了对本发明的技术特征、目的和有益效果有更加清楚的理解,现对本发明的技术方案精选以下详细说明。显然,所描述的实施案例是本发明一部分实施例,而不是全部实施例,不能理解为对本发明可实施范围的限定。基于本发明的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的其他所有实施例,都属于本发明的保护范围。
[0016]
实施例1请参阅图1-2,一种规避容器中僵尸进程的方法,包括以下步骤:使用流水线构建image容器镜像;容器镜像编译;镜像的entrypoint启动参数设置,使进程启动顺序为首先启动dumb-init进行作为系统pid为0的父进程,后续业务应用进程直接被dumb-init守护进程接管,业务子进程的销毁和新建都由父进程统一处理,以彻底预防容器化应用出现僵尸进程。
[0017]
具体的,所述image容器镜像构建,包括以下子步骤:base基础镜像:base基础镜像中存放dump-init进程控制二进制程序,该程序主要充当linux操作系统中的supervisor和init system并且运行时以pid1在容器中运行,业务容器所有进程均有该进程控制;业务基础镜像构建:在第二阶构建业务image镜像时,从第一阶段base基础镜像中
复制dump-init二进制执行文件,并存放在当前业务基础镜像的寄存目录下,并进行可执行授权;业务应用镜像endponits:在业务镜像的dockerfile中,业务容器的启动endponits基于语法规则添加dump-init启动参数。
[0018]
具体的,所述容器镜像编译,包括以下子步骤:编译基础镜像,将代码从代码仓库下载,并下载相关依赖库文件安装;设置编译环境变量,使得在编译之后的制品中注入有效环境信息,用于后期该镜像容器化启动需要和安全类加固。
[0019]
具体的,所述entrypoint启动参数设置的命令式为:entrypoint ["/usr/bin/dumb-init", "", "/main"]。
[0020]
具体的,所述业务基础镜像的寄存目录具体是/usr/local/bin。
[0021]
具体的,所述的语法规则包括json语法。
[0022]
以上显示和描述了本发明的基本原理、主要特征和本发明的优点。本行业的技术人员应该了解,本发明不受上述实施例的限制,上述实施例和说明书中描述的只是说明本发明的原理,在不脱离本发明精神和范围的前提下,本发明还会有各种变化和改进,这些变化和改进都落入要求保护的本发明范围内。本发明要求保护的范围由所附的权利要求书及其等效物界定。
[0023]
需要说明的是,对于前述的各个方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本技术并不受所描述的动作顺序的限制,因为依据本技术,某一些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和单元并不一定是本技术所必须的。
[0024]
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详细描述的部分,可以参见其他实施例的相关描述。
[0025]
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、rom、ram等。
[0026]
以上所揭露的仅为本发明较佳实施例而已,当然不能以此来限定本发明之权利范围,因此依本发明权利要求所作的等同变化,仍属本发明所涵盖的范围。
技术特征:1.一种规避容器中僵尸进程的方法,包括以下步骤:使用流水线构建image容器镜像;容器镜像编译;镜像的entrypoint启动参数设置,使进程启动顺序为首先启动dumb-init进行作为系统pid为0的父进程,后续业务应用进程直接被dumb-init守护进程接管,业务子进程的销毁和新建都由父进程统一处理,以彻底预防容器化应用出现僵尸进程。2.根据权利要求1所述的一种规避容器中僵尸进程的方法,其特征在于,所述image容器镜像构建,包括以下子步骤:base基础镜像:base基础镜像中存放dump-init进程控制二进制程序,该程序主要充当linux操作系统中的supervisor和init system并且运行时以pid1在容器中运行,业务容器所有进程均有该进程控制;业务基础镜像构建:在第二阶构建业务image镜像时,从第一阶段base基础镜像中复制dump-init二进制执行文件,并存放在当前业务基础镜像的寄存目录下,并进行可执行授权;业务应用镜像endponits:在业务镜像的dockerfile中,业务容器的启动endponits基于语法规则添加dump-init启动参数。3.根据权利要求1所述的一种规避容器中僵尸进程的方法,其特征在于,所述容器镜像编译,包括以下子步骤:编译基础镜像,将代码从代码仓库下载,并下载相关依赖库文件安装;设置编译环境变量,使得在编译之后的制品中注入有效环境信息,用于后期该镜像容器化启动需要和安全类加固。4.根据权利要求1所述的一种规避容器中僵尸进程的方法,其特征在于,所述entrypoint启动参数设置的命令式为:entrypoint ["/usr/bin/dumb-init", "", "/main"]。5.根据权利要求1所述的一种规避容器中僵尸进程的方法,其特征在于,所述业务基础镜像的寄存目录具体是/usr/local/bin。6.根据权利要求2所述的一种规避容器中僵尸进程的方法,其特征在于,所述的语法规则包括json语法。
技术总结本发明公开了一种规避容器中僵尸进程的方法,所述方法包括使用流水线构建image容器镜像和容器镜像编译;所述image容器镜像构建,包括Base基础镜像子步骤、业务基础镜像构建子步骤和业务应用镜像ENDPONITS子步骤;所述容器镜像编译,包括编译基础镜像子步骤和设置编译环境变量子步骤;本发明利用Linux进程管理机制,使用dumb-init的方式解决了容器在运行过程中,销毁等情况下出现宿主主机很多僵尸进程问题,从而导致资源浪费,尤其PID进程号的耗尽。同时采用Dockerfile多阶构建,有效缩减业务容器镜像大小,更加充分利用计算资源用于业务应用。务应用。务应用。
技术研发人员:牛建平 谢斌 王超
受保护的技术使用者:启明信息技术股份有限公司
技术研发日:2022.07.06
技术公布日:2022/11/1