Hay --init y --init-path para docker run , pero no está claro cómo usarlo.
Al principio, pensé que era algo así como dumb-init , pero incluido en el núcleo de la ventana acoplable (algo así como "nativo"). Pero la clave --init exige que también se configure --init-path , apuntando al binario docker-init , y no da ninguna pista sobre dónde tomarlo. Google guarda silencio sobre docker-init .
De acuerdo, tal vez se supone que debo usar yelp/dumb-init o 'phusion/baseimage-docker', pero esas soluciones no parecen usar la opción --init de docker run .
Entonces, tengo curiosidad, ¿dónde tomo este "binario docker-init" para establecer la --init-path ?
Especificar la nueva opción docker --init en el comando de ejecución básicamente establece ENTRYPOINT en tini y le pasa el CMD o lo que especifique en la línea de comandos.
Por ejemplo, sin init, CMD se convierte en pid 1. En este caso, /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 -fACon --init, tini (/dev/init) se convierte en 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 -fAtini es un proceso de inicio de primera clase que se puede ejecutar como pid 1 correctamente. Un proceso pid 1 debe cosechar correctamente los procesos secundarios bifurcados, si no lo hace, suceden cosas malas, como la fuga de recursos y la aparición de zombis.
Esto es lo que desea para las aplicaciones que se bifurcan y no se han escrito pensando en la recolección de niños, ya que normalmente dejarían esto en manos del sistema de inicio. Un ejemplo clásico son las aplicaciones Java Jenkins.
Encontré esto en la documentación :
Puede usar el indicador --init para indicar que se debe usar un proceso de inicio como el PID 1 en el contenedor. Especificar un proceso de inicio garantiza que las responsabilidades habituales de un sistema de inicio, como cosechar procesos zombie, se realicen dentro del contenedor creado. El proceso de inicio predeterminado que se usa es el primer ejecutable docker-init que se encuentra en la ruta del sistema del proceso del demonio de Docker. Este binario docker-init, incluido en la instalación predeterminada, está respaldado por tini .
No pude encontrar docker-init en una instalación de macOS Docker, pero en Linux está aquí:
/usr/bin/docker-init