--init
有--init-path
和docker 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
设置为?
答案 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