对Docker来说,dumb-init有多重要?

Gol*_*den 31 init docker

我希望这个问题不会被标记为primarily opinion-based,但是有一个客观的答案.

我已经阅读了介绍dumb-init,一个用于Docker容器的init系统,它广泛地描述了为什么以及如何使用它dumb-init.老实说,对于那些对Linux流程结构不太有经验的人来说,这听起来非常引人注目 - 如果你不使用它,感觉好像你做的事情完全错了dumb-init.

这就是我考虑在我自己的Docker镜像中使用它的原因...让我无法做到这一点的原因是我还没有找到使用它的官方Docker镜像.

  • mongo为例:他们mongod直接打电话.
  • postgres为例:他们postgres直接打电话.
  • 节点为例:他们node直接打电话.
  • ...

如果dumb-init这样重要的-为什么是明显地没有人使用它吗?我在这里错过了什么?

Ste*_*rer 19

喜欢的东西哑初始化TINI可以,如果你有一个派生新工艺过程中使用,你不具有良好的信号处理实现赶上孩子信号,停止你的孩子,如果你的过程中,应停止等.

如果您的进程没有生成新进程(例如,Node.js),那么这可能没有必要.

我猜MongoDB,PostgreSQL,......可以运行子进程,实现了良好的信号处理程序.否则会有僵尸进程,有人提出了一个问题来解决这个问题.

唯一的问题可能是官方语言图像,如node,ruby,golang.它们没有dumb-init/tini,因为你通常不需要它们.但这取决于开发人员可能实现错误的子执行代码来修复信号处理程序或使用帮助程序作为PID 1.

  • 这不完全正确.例如,Bash脚本不能正确处理和发出信号.Mongo/Postgres还依赖OS的init系统来处理僵尸并处理子进程的收获.这就是它的工作方式.此外,docker将很快拥有自己的init处理程序(现在合并为master),但是在你拥有支持它的版本之前,你应该总是拥有可以获得进程的PID1进程.请参阅:https://blog.phusion.nl/2015/01/20/docker-and-the-pid-1-zombie-reaping-problem/ (3认同)
  • `gosu` README 说它是 `exec` 进程,这意味着该进程将变成 PID1,所以这是正交的。gosu 所做的就是根据设计切换 UID(顺便说一句,在容器用例之外是[危险](https://github.com/tianon/gosu/issues/37))。然而,拥有一个entrypoint.sh脚本意味着运行该脚本的shell是PID1,并且可以使用“trap”来传递信号,理论上“wait --any”来收获僵尸——除非脚本以“exec”结尾,它在蒙戈的例子。 (2认同)