Ответ 1
Спецификация новой опции docker --init в команде запуска в основном устанавливает ENTRYPOINT в tini и передает CMD ей или тому, что вы указываете в командной строке.
Например, без init CMD становится pid 1. В этом случае /bin/ bash
docker run -ti --rm ubuntu:16.04 /bin/bash
[email protected]:/# 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
[email protected]:/# 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 правильно. Процесс pid 1 должен правильно обработать дочерние процессы, если это не происходит, тогда плохие вещи случаются, когда возникают утечки ресурсов и появляются зомби.
Это то, что вы хотите для приложений, которые fork и не были написаны с учетом детства, поскольку обычно они оставляют это до системы init. Классическим примером являются приложения Java Jenkins.