关于使用/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 && : '
就是后边再加的命令啥都行,这里使用:,就是啥也不干的命令