如何在docker run中使用--init参数

时间:2017-03-30 15:24:33

标签: docker

--init--init-pathdocker run个选项,但目前尚不清楚如何使用它。

起初,我认为它类似于dumb-init,但包含在docker core(有点像“native”)中。但--init关键要求--init-path也要设置,指向'docker-init binary',并且不知道在哪里接受它。谷歌对'docker-init'保持沉默。

好吧,也许我应该使用'yelp / dumb-init'或'phusion / baseimage-docker',但这些解决方案似乎没有使用docker run的{​​{1}}选项

所以,我很好奇我在哪里使用这个“docker-init binary”将--init设置为?

2 个答案:

答案 0 :(得分:42)

在run命令中指定新的docker --init选项基本上将ENTRYPOINT设置为tini并将CMD传递给它或您在命令行上指定的任何内容。

例如,在没有init的情况下,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是一个可以正确运行为pid 1的第一类init进程。一个pid 1进程必须正确地收集分叉的子进程,如果它没有发生,就像资源泄漏和僵尸出现一样。

这就是你想要的那些应用程序,fork和避难所是在考虑到孩子时所记录的,因为通常他们会把它留给init系统。一个典型的例子是java Jenkins应用程序。

答案 1 :(得分:5)

我在documentation中找到了这个:

  

您可以使用--init标志来指示init进程应该是   用作容器中的PID 1。指定init进程可确保   init系统的通常职责,例如收获僵尸   进程,在创建的容器内执行。默认   使用的init进程是第一个找到的docker-init可执行文件   Docker守护程序进程的系统路径。这个docker-init二进制文件,   包含在默认安装中,由。提供支持   tini

我无法在macOS Docker安装上找到docker-init,但在Linux上它就在这里:

/usr/bin/docker-init