关于使用/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 && : '
        就是后边再加的命令啥都行,这里使用:,就是啥也不干的命令
相关推荐
Sarvartha3 小时前
数组基础知识
java·开发语言
泡海椒3 小时前
金融报表开发:jquick-pdf K 线图 PDF 可视化解决方案
java·开发语言·金融·pdf
孙启超4 小时前
【AI开发之Rust】第 17 课:项目总览与核心架构 —— AI 助手 Rust 核心从 0 到 1
开发语言·后端·rust
心中有你02144 小时前
C语言 二叉搜索树(BST)超详细完整实现(插入+查找+删除+三种遍历+内存释放)
c语言
码匠许师傅4 小时前
【C++三方组件】Asio 上篇:回调式 TCP 客户端与服务端
开发语言·c++·tcp/ip
神仙别闹4 小时前
基于C语言实现 TINY+ 编译器
c语言·开发语言·数据库
Wang's Blog4 小时前
Java 项目实战: 外卖平台优化-从库Slave配置与主从复制验证
java·开发语言
知识分享小能手4 小时前
C++ 学习教程,从入门到精通,C++内存模型和名称空间 — 详细知识点总结(9)
开发语言·c++·学习
2601_962218615 小时前
c++中多重继承与虚继承的实现
开发语言·c++
我是小白呀5 小时前
17-企业Workflow引擎怎么选:定时、队列、n8n、Temporal与Camunda
java·开发语言·人工智能·dubbo·workflow