关于使用/bin/sh -c 用于Dockerfile的Entrypoint的问题

问题描述

相同的dockerfile,使用不同的基础镜像制作镜像1号进程不相同

ENTRYPOINT都是: /bin/sh -c 'pre-start.sh && myblockserver '的形式

就是执行多个命令命令,最后的一个命令是阻塞的

复制代码
镜像1:   1号进程是 /bin/sh -c pre-start.sh && myblockserver    【单引号被系统去掉了】
        sleep 99d 作为子进程运行

 可以总结为:-c 后边如果是使用&&连接的多个命令并且有阻塞的命令
           /bin/sh -c pre-start.sh && myblockserver 就不会退出

镜像2:  1号进程是就是myblockserver 

可以总结为: -c &&连接的命令,如果只有最后一个命令是阻塞的,
           那么/bin/sh -c pre-start.sh && myblockserver  会退出

问题: 如果myblockserver 没有处理回收子进程的的能力,
      容器里新的孤儿进程都会变成僵尸进程 例如 [sshd] <defunct>

问题分析: 两个基础镜像的bash的版本不同

复制代码
镜像1: GNU bash, version 5.1.9 
       如果 &&连接的命名只有最后一个是阻塞的 /bin/sh -c 会退出
       
镜像2: GUN bash,version 4.2.26  
          如果 &&连接的命名只有最后一个是阻塞的 /bin/sh -c 不会退出

规避方案

复制代码
如果不想让/bin/sh -c 退出(bash可以回收僵尸进程):
判断bash版本(这个有点麻烦)

或者: /bin/sh -c 'pre-start.sh && myblockserver && : '
        就是后边再加的命令啥都行,这里使用:,就是啥也不干的命令
相关推荐
流星白龙1 小时前
【Qt】1.安装QT
开发语言·qt
励志不掉头发的内向程序员1 小时前
【Linux系列】解码 Linux 内存地图:从虚拟到物理的寻宝之旅
linux·运维·服务器·开发语言·学习
深盾科技2 小时前
C/C++逆向分析实战:变量的奥秘与安全防护
c语言·c++·安全
superxxd3 小时前
跨平台音频IO处理库libsoundio实践
开发语言·qt·音视频
_OP_CHEN5 小时前
C++基础:(十二)list类的基础使用
开发语言·数据结构·c++·stl·list类·list核心接口·list底层原理
爱隐身的官人7 小时前
谷歌 chrome 浏览器安装crx插件(hackbar为例)
chrome·渗透测试·hackbar
谷歌开发者7 小时前
Web 开发指向标 | Chrome 开发者工具学习资源 (一)
前端·chrome·学习
天***88967 小时前
Chrome 安装失败且提示“无可用的更新” 或 “与服务器的连接意外终止”,Chrome 离线版下载安装教程
前端·chrome
ONE_PUNCH_Ge8 小时前
Go 语言变量
开发语言
幼稚园的山代王8 小时前
go语言了解
开发语言·后端·golang