关于使用/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 && : '
        就是后边再加的命令啥都行,这里使用:,就是啥也不干的命令
相关推荐
历程里程碑5 分钟前
Linux 2 指令(2)进阶:内置与外置命令解析
linux·运维·服务器·c语言·开发语言·数据结构·ubuntu
王燕龙(大卫)9 分钟前
rust入门
开发语言·rust
无心水9 分钟前
2、Go语言源码文件组织与命令源码文件实战指南
开发语言·人工智能·后端·机器学习·golang·go·gopath
2501_9445264210 分钟前
Flutter for OpenHarmony 万能游戏库App实战 - 主题切换实现
android·开发语言·javascript·python·flutter·游戏·django
张张努力变强11 分钟前
C++ 类和对象(三):拷贝构造函数与赋值运算符重载之核心实现
开发语言·c++
福楠13 分钟前
C++ STL | set、multiset
c语言·开发语言·数据结构·c++·算法
一晌小贪欢13 分钟前
Python 健壮性进阶:精通 TCP/IP 网络编程与 requirements.txt 的最佳实践
开发语言·网络·python·网络协议·tcp/ip·python基础·python小白
enfpZZ小狗15 分钟前
基于C++的反射机制探索
开发语言·c++·算法
曹牧15 分钟前
C#:WebReference
开发语言·c#
黎雁·泠崖18 分钟前
Java static入门:概述+静态变量特点与基础实战
java·开发语言