Подтвердить что ты не робот

Как использовать параметр -init в запуске докеров

Существуют опции --init и --init-path для docker run, но неясно, как его использовать.

Сначала я подумал, что это что-то вроде dumb-init, но включено в ядро ​​докера (вроде "native" ). Но ключ --init требует установки --init-path, указывая на "docker-init binary", и не дает никакого представления о том, где его взять. Google молчал о "docker-init".

Хорошо, возможно, я должен использовать "yelp/dumb-init" или "phusion/baseimage-docker", но эти решения, похоже, не используют параметр docker run --init.

Итак, мне любопытно, где взять этот "docker-init binary", чтобы установить --init-path на?

4b9b3361

Ответ 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.

Ответ 2

Я нашел это в документации:

Вы можете использовать флаг -init, чтобы указать, что процесс init должен быть используемый в качестве ПИД-1 в контейнере. Указание процесса init обеспечивает обычные обязанности системы init, такие как пожинание зомби процессы, выполняются внутри созданного контейнера. По умолчанию init - это первый исполняемый файл docker-init, найденный в системный путь процесса демона Docker. Этот двоичный файл docker-init, включенный в установку по умолчанию, подкрепляется tini.

Я не смог найти docker-init на установке MacOS Docker, но в Linux он здесь:

/usr/bin/docker-init