当 docker 使用 `/bin/sh -c` 运行节点脚本时,SIGTERM 无法到达节点脚本

2024-03-28

当我的 Dockerfile 结尾时

CMD node .

docker 使用以下命令运行该容器/bin/sh -c "node ."而不是简单地node .(我知道,我可以这样做CMD ["node", "."]).

我认为这种行为实际上很好,因为这意味着在容器内部PID1 is /bin/sh而不是我简陋的节点脚本。

如果我理解正确的话PID1负责收获孤立的僵尸进程,我真的不想为此负责......所以如果/bin/sh能做到这一点,那就太好了。 (我实际上认为这就是 docker 重写我的原因CMD).

问题是当我发送一个SIGTERM到容器(开始于/bin/sh -c "node ."),或者通过docker-composer stop or docker-composer kill -s SIGTERM,信号没有到达我的node进程,因此每次都会被强行杀死SIGKILL10 秒宽限期后。不太好。

有没有办法让人管理我的僵尸并让我的节点实例接收docker发送的信号?


我认为你必须了解以下角色ENTRYPOINT and CMD,并使用ENTRYPOINT(执行形式)以你的方式Dockerfile.

ENTRYPOINT,指定容器的起始可执行文件,是Docker容器的核心部分。每个集装箱MUST有一个入口点来决定从哪里开始。默认值为/bin/bash -c。此外,所有设置CMD将被附加到ENTRYPOINT作为参数。

因此,如果您未能指定ENTRYPOINT在你的Dockerfile,实际的入口点是/bin/bash -c {your_command_in_CMD},不幸的是DOES NOT传递信号。

ENTRYPOINT有两种形式:执行形式 and 贝壳形式

  • 执行形式:ENTRYPOINT ["可执行文件", "param1", "param2"]
  • shell形式:命令 param1 param2

As the Docker 参考 https://docs.docker.com/engine/reference/builder/#entrypoint指出:推荐使用exec形式,shell形式的缺点是command执行者/bin/bash -c,这可能不适用于信号:

The 贝壳形式防止任何CMD or run命令行参数被使用,但缺点是你ENTRYPOINT将作为子命令启动/bin/sh -c,不传递信号。这意味着可执行文件不是容器的PID 1 - and will not接收 Unix 信号 - 所以你的可执行文件不会接收SIGTERM from docker stop <container>.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当 docker 使用 `/bin/sh -c` 运行节点脚本时,SIGTERM 无法到达节点脚本 的相关文章

随机推荐

  • Scala,让我的循环更加实用

    我正在尝试减少像 Java 一样编写 Scala 2 8 的程度 这是我遇到的问题的简化 您能否对我的解决方案提出 更实用 的改进建议 变换地图 val inputMap mutable LinkedHashMap 1 gt a 2 gt
  • 在 Bash 中执行时间戳比较的最佳方法是什么

    我有一个警报脚本 我试图阻止它向我发送垃圾邮件 因此我想设置一个条件 如果在过去一小时内发送了警报 则不再发送警报 现在我有一个 cron 作业 每分钟检查一次条件 因为我需要在满足条件时快速收到警报 但我不需要每分钟都收到电子邮件 直到问
  • Spark - 是否可以控制分区到节点的放置?

    在 Spark 中 自定义Partitioner可以为 RDD 提供 通常 生成的分区会随机分配给一组工作人员 例如 如果我们有 20 个分区和 4 个工作线程 则每个工作线程将 大约 获得 5 个分区 然而 放置分区到工作节点 节点 看起
  • 将 ChartPanel 添加到 JPanel

    我这里有一些不起作用的代码 XYSeriesCollection dataset new XYSeriesCollection dataset addSeries series JFreeChart chart ChartFactory c
  • Angularjs:理解递归指令

    我在这里找到了一个很棒的树指令 原来的 http jsfiddle net n8dPm http jsfiddle net n8dPm 我一直试图通过其他几个问题来理解它的功能 1 https stackoverflow com quest
  • 如何在表单应用程序中获取参数?

    我可以找到许多有关如何在控制台应用程序中获取参数的示例 但我似乎找不到如何在 Windows 窗体应用程序中获取参数的示例 我想关注以下事情 每当我打开 jpg 文件时 Windows 都会启动我的应用程序 我想知道我的应用程序中 jpg
  • AWS Lambda 和 AWS API Gateway:如何发送二进制文件?

    我有一个 lambda 函数 它使用事件中的输入键从 s3 获取文件 并需要将其发送到客户端 我正在使用以下函数从 s3 获取文件 function getObject key var params Bucket my bucket Key
  • PouchDb.get(id,{attachments: true}) 在 Android 上不返回数据

    我正在使用 PouchDb 无复制 开发一个 Ionic 应用程序 我能够成功地存储带有附件的数据 为了检索数据 我使用下面的控制器片段来调用 angularjs 工厂中的 get 函数 pouchDbManager getData cur
  • 春云流兔的退避设置

    我仍在使用rabbitmq和spring云消息传递设置示例消息传递系统 但遇到了错误 或者我误解了文档 使用spring boot版本2 0 3 RELEASE 为了这个例子 我想要以下设置 spring cloud stream rabb
  • 如何将具有多个依赖项的 C 库编译到 Python 包中? Cmake?

    我在 python3 x 中有一个 Python 包 我一直在编写它 它与 C 库中的两个 C 函数交互 目前 我一直在使用ctypes我直接链接到共享库 so 然后使用 python 脚本与之交互 https docs python or
  • 为协作者使用 git 存储库的最佳方式是什么?

    一般来说 为协作者使用存储库的最佳方式是什么 我们应该只从主存储库中推送和拉取 还是为每个协作者创建一个分支 然后在适当的时候进行合并 如果这是一个愚蠢 基本的问题 我深表歉意 git noob 在这里 谢谢 Git 支持许多不同的工作流程
  • 无法将搜索栏拖动到滚动视图内

    如果这个问题在其他地方得到了回答 我深表歉意 我找不到任何有同样问题的人 我将 SeekBar 添加到位于嵌套 ScrollView 内的relativelayout 但是 我无法拖动搜索栏的拇指 我可以沿着其路径单击来更改其值 但无法拖动
  • 模板类的模板成员函数的类外定义的语法

    template
  • 无法计算表达式,因为代码已优化或本机框架位于调用堆栈顶部

    我正在开发一个网站 用户可以在该网站上提交一些信息 提交信息后 我尝试同时发送两封邮件 一封发送给我的销售团队 一封发送给我网站上的访问者 在发送邮件时 我在使用重定向到另一个页面时收到以下错误Response Redirect http
  • 在 Windows 10 中使用 PS 将程序(带参数)固定到任务栏

    我可以使用下面的代码将程序固定到 Windows 10 任务栏 感谢this https stackoverflow com questions 31720595 pin program to taskbar using ps in win
  • 在 SQLAlchemy 中使用 Postgres/PostGIS 视图

    两个问题 我想在我的 PostGIS DB 中生成一个视图 如何将此视图添加到我的 Geometry columns 表中 我必须做什么 才能将视图与 SQLAlchemy 一起使用 SQLAlchemy 的表和视图之间有区别吗 或者我可以
  • AuthenticationHeaderValue 与 NetworkCredential

    我正在尝试使用 HttpClient 为 HTTP Post 或 HTTP Get 编写客户端 当谷歌搜索时 我遇到了这些在 HttpClient 对象中设置这些身份验证的方法 一个使用 NetworkCredential 另一个使用 Au
  • Log4net keepLo​​gFileNameExtension 不起作用

    这是我的 log4net 配置 滚动日志文件创建的扩展名错误 第一个文件使用 log debug txt 名称创建 滚动文件使用 log debug txt 1 创建 但理想情况下它应该是 log debug 1 txt 我使用preser
  • 用于商业应用程序的本机 .NET 版本的 Rsync 可用吗?

    目前我们正在评估是否可以提供rsync http en wikipedia org wiki Rsync对我们销售的应用程序的支持 我用谷歌搜索并找到了一些参考资料 rsync 的本机 Window 版本 http www backupce
  • 当 docker 使用 `/bin/sh -c` 运行节点脚本时,SIGTERM 无法到达节点脚本

    当我的 Dockerfile 结尾时 CMD node docker 使用以下命令运行该容器 bin sh c node 而不是简单地node 我知道 我可以这样做CMD node 我认为这种行为实际上很好 因为这意味着在容器内部PID1