关于使用/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 && : '
        就是后边再加的命令啥都行,这里使用:,就是啥也不干的命令
相关推荐
Code_流苏几秒前
C++课设:智能优惠快餐点餐系统
开发语言·c++·课设·期末大作业·快餐点餐系统·智能优惠算法
sss191s26 分钟前
Java 集合面试题 PDF 及常见考点解析与备考指南
java·开发语言·pdf
老刘忙Giser26 分钟前
c# List<string>.Add(s) 报错:UnsupportedOperationException
开发语言·c#
陳麦冬28 分钟前
深入理解指针(二)
c语言·学习
itwlz35 分钟前
vite配置@别名,以及如何让IDE智能提示路经
开发语言·前端·javascript
lichenyang45337 分钟前
添加按钮跳转页面并且根据网站的用户状态判断是否显示按钮
开发语言·前端·javascript
誰能久伴不乏41 分钟前
Qt 开发中的父类与父对象的区别和父对象传递:如何选择 `QWidget` 或 `QObject`?
java·开发语言·qt
弱冠少年41 分钟前
golang入门
开发语言·后端·golang
Humbunklung44 分钟前
Rust 函数
开发语言·后端·rust
waterHBO1 小时前
python 爬虫工具 mitmproxy, 几问几答,记录一下
开发语言·爬虫·python