如何在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