什么时候不使用docker run --init

Pet*_*sen 6 docker

--init标志docker run原因tini初始化系统被用作ENTRYPOINT。结果,在容器中运行的应用程序将是init系统的子进程,因此它可以处理信号处理,僵尸收割等工作。

docker-compose也有一个init: true服务设置。

正如tini透明地工作一样,无需以任何方式修改Dockerfile(这就是tini文档所说的)。

所以我的问题是:

  • 使用有什么缺点--init吗?
  • 在哪种情况下最好避免使用--init
  • 如果没有严重的缺点:为什么--init没有默认设置?

Bob*_*hev 7

使用--init标志没有任何缺点。但是,容器中 PID 为 1 的进程并不能涵盖 init 进程的所有功能。对于大多数情况,这应该不是问题,因为您只需要信号处理和子进程处理。

在什么情况下最好避免使用--init?

如果您对应用程序进行编码来处理信号,例如在 NodeJS 中:

const registerSignals = () => {
process.on('SIGTERM', () => {
    console.log('SIGTERM received');
    shutDown(0);
});
process.on('SIGINT', () => {
    console.log('SIGTERM received');
    shutDown(0);
});
}
Run Code Online (Sandbox Code Playgroud)

如果你没有僵尸进程可以收获或者你自己收获僵尸进程

那么你可以避免使用--inittini (如果你希望上面的代码片段工作,请确保在启动容器时使用 exec 形式)

如果没有严重的缺点:为什么 --init 不是默认设置?

因为让你的容器像我的代码片段所示那样感知信号并不那么困难,而且你可能会遇到一些 tini 未涵盖的 PID 1 的特殊情况,因此没有充分的理由在所有容器中默认注入 tini。

编辑:添加卡梅伦的建议

  • 1.) tini 不涵盖哪些 init 系统功能?我找不到应该支持的规范。2.) tini 将信号转发给其子级,因此信号感知应用程序应该可以工作(这不是避免 tini 的理由)。3.) 有很多标准映像如果没有 --init 就无法正常运行。例如,MariaDB 的入口点脚本错误处理 SIGTERM;在 docker-compose 的上下文中,这会导致 MariaDB 一段时间后被杀死。如果 tini 是默认值(对于特殊情况可能加上 --no-init 标志),则不会发生此类问题。 (3认同)