docker run
有--init
和--init-path
选项,但是不清楚怎么用。
起初,我认为它类似于 dumb-init ,但包含在 docker core 中(一种“本地”)。但是 --init
键要求也设置 --init-path
,指向 docker-init
二进制文件,并且没有给出任何线索在哪里拿。 Google 对 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 是一个可以作为 pid 1 正确运行的一流的 init 进程。 pid 1 进程必须正确地获取 fork 的子进程,否则会发生诸如资源泄漏和僵尸出现等坏事。
对于那些 fork 并且没有考虑到 child 收获的应用程序,这就是您想要的,因为通常他们会将这留给 init 系统。一个经典的例子是 java Jenkins 应用程序。
关于docker - 如何在 docker run 中使用 --init 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43122080/