如何在Docker运行中使用–init参数

--init docker run--init--init-path选项,但不清楚如何使用它。

起初,我认为这是类似dumb-init的东西,但包含在docker核心(一种“本地”)中。 但是--init关键要求--init-path也要设置--init-path ,指向'docker-init'二进制文件,并且不知道该把它放在哪里。 Google对“docker-init”保持沉默。

好的,也许我应该使用'yelp / dumb-init'或'phusion / baseimage-docker',但是这些解决scheme似乎并没有使用--init docker run--init选项。

所以,我很好奇我在哪里把这个“ --init-path init binary”设置为--init-path

在运行命令中指定新的docker –init选项基本上将ENTRYPOINT设置为tini,并将CMD传递给它或者你在命令行中指定的任何东西。

例如,如果没有初始化,CMD变成pid 1.在这种情况下,/ bin / bash

 docker run -ti --rm ubuntu:16.04 /bin/bash root@d740f7360840:/# ps -fA UID PID PPID C STIME TTY TIME CMD root 1 0 1 03:30 ? 00:00:00 /bin/bash root 11 1 0 03:30 ? 00:00:00 ps -fA 

用–init,tini(/ dev / init)变成pid 1

 docker run -ti --init --rm ubuntu:16.04 /bin/bash root@5b5fe6ee71b5:/# ps -fA UID PID PPID C STIME TTY TIME CMD root 1 0 1 03:30 ? 00:00:00 /dev/init -- /bin/bash root 7 1 0 03:30 ? 00:00:00 /bin/bash root 12 7 0 03:30 ? 00:00:00 ps -fA 

tini是一个第一类init进程,可以正确运行为pid 1。 一个PID 1进程必须收获正确的分叉subprocess,如果不是,那么不好的事情发生,如资源泄漏和僵尸出现。

这就是你想要的应用程序,叉和没有写入孩子收获记,因为通常他们会离开这个系统的初始化。 一个经典的例子是java Jenkins应用程序。

我在文档中find了这个:

您可以使用–init标志来指示init进程应该用作容器中的PID 1。 指定初始化进程可以确保在创build的容器内部执行初始化系统(如收割僵尸进程)的常规职责。 使用的默认init进程是在Docker守护进程的系统path中find的第一个docker-init可执行文件。 包含在默认安装中的docker -init二进制文件由tini提供支持。

我无法在macOS Docker安装上finddocker-init ,但在Linux上它是这样的:

/usr/bin/docker-init