首页 重大发现重大领悟

重大发现重大领悟

牛仔抄 2019-12-19 0 226

刚刚在重温docker官方文档时,发现如下字句:

“对于容器而言,其启动程序就是容器应用进程,容器就是为了主进程而存在的,主进程退出,容器就失去了存在的意义,从而退出,其它辅助进程不是它需要关心的东西。”
容器就是为了主进程而存在的。。。。。
主进程退出,容器就失去了存在的意义,从而退出。。。。。
原来,每个容器运行时,dockerfile里指定的命令在容器里的PID为1,只要这个1的进程不退出,不后台运行,容器就会一直运行,如果该容器的基础是一个Linux镜像的话,岂不是相当于这个linux系统一直在运行?
在一个运行的linux系统里安装和运行其它程序,不是轻而易举的事情?
谁规定dockerfile里指定的一定必须是自己想要运行的程序?(虽然官方文档以及最佳实践建议是这样)
妈妈的,这么简单的逻辑,为什么到今天才想通?
僵化思维好可怕。。。。

回想起之前看到的supervisor没有指定运行程序而这个程序也可以跑,结合今天的想法,终于想明白了,那个supervisor的作用并不是监控这个程序的运行,而是作为容器的主进程让容器一直运行,然后在里面运行真正需要的东西:LNMP start!
只有在这种情况下,类似于LNMP START这样的命令才会生效。。。。

大胆假设,小心求证。那要怎样弄一个会一直运行的进程呢?supervisor是一个不错的选择,但是必须要安装而且配置略显复杂。如果用其它比较容易用CMD来指定的程序,又显得多余而且累赘。

有没有可能运行一个脚本来作为主进程呢?似乎是一个不错的主意,那要怎样保证这个脚本一直运行下去呢?
突然想到死循环。。。
没错,初学C语言经常不小心弄出来的,把机房里的机器搞到崩溃死机的死循环!!
要解决的问题是,死循环会一直跑,如果不断有输出的话,势必有一天会把宿主机的内存全部吃掉导致死机,一如当年的C语言。。。。

所以,要解决的问题是。。。这个死循环必须是没有任何输出的,并且必须无条件地循环。。。
经过实践,在脚本的最后写入以下语句可以实现无条件死循环:

while [[ true ]]; do
sleep 1d
done

在该语句上面可以适当写入其它语句,比如想要的进程的启动命令。。。

并且这个脚本本身的开销几乎为零。。。。

用它作为容器的主进程而言,简直了。。。。

oh yeah,,,, 真他妈天才!!

作者: 牛仔抄
牛仔抄

迷途小书童,热衷于电脑与网络技术,自学多年,一事无成。

发表评论: