--init
有 --init-path
和 docker run
选项,但不清楚如何使用它。
起初,我认为它类似于 dumb-init ,但包含在 docker core 中(有点“原生”)。但是 --init
key 也需要设置 --init-path
,指向“docker-init binary”,并且不知道从哪里获取它。谷歌对“docker-init”保持沉默。
好吧,也许我应该使用 'yelp/dumb-init' 或 'phusion/baseimage-docker',但这些解决方案似乎没有使用 docker run
的 --init
选项。
所以,我很好奇我在哪里把这个“docker-init 二进制文件”设置为 --init-path
?
最佳答案
在运行命令中指定新的 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 是一流的 init 进程,可以正确地作为 pid 1 运行。 pid 1 进程必须正确地获取 fork 子进程,如果没有,则会发生诸如资源泄漏和僵尸出现之类的坏事。
对于 fork 的应用程序来说,这就是您想要的,并且没有像通常那样将 child 收割的想法留给 init 系统。一个经典的例子是 java Jenkins 应用程序。
关于docker - 如何在 docker run 中使用 --init 参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43122080/