init pequeño pero válido para contenedores Tini es el init más simple que se te ocurra.
Todo lo que Tini hace es engendrar a un solo niño (Tini debe ejecutarse en un contenedor), y esperar a que salga todo el tiempo que cosecha zombis y realiza el reenvío de la señal.
Usar Tini tiene varios beneficios:
SIGTERM termina adecuadamente su proceso, incluso si no instaló explícitamente un controlador de señal para él.Si desea más detalles sobre por qué esto es útil, revise este tema Discusión: ¿Qué es la ventaja de Tini?
Nota: Si está utilizando Docker 1.13 o más, TINI está incluido en el propio Docker. Esto incluye todas las versiones de Docker CE. Para habilitar TINI, simplemente pase la bandera --init a docker run .
Nota: Hay imágenes de Docker prebujadas disponibles para TINI. Si actualmente está utilizando una imagen Ubuntu o CentOS como base, puede usar uno de ellos como reemplazo de entrega.
Nota: Hay paquetes Tini para Alpine Linux y Nixos. Consulte a continuación las instrucciones de instalación.
Agregue Tini a su contenedor y hágalo ejecutable. Luego, simplemente invoque Tini y apruebe su programa y sus argumentos como argumentos a Tini.
En Docker, querrá usar un punto de entrada para que no tenga que recordar invocar manualmente TINI:
# Add Tini
ENV TINI_VERSION v0.19.0
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
RUN chmod +x /tini
ENTRYPOINT ["/tini", "--"]
# Run your program under Tini
CMD ["/your/program", "-and", "-its", "arguments"]
# or docker run your-image /your/program ...
Tenga en cuenta que puede omitir el -- bajo ciertas condiciones, pero también podría incluirlo siempre para estar seguro. Si ve un mensaje de error que se parece a tini: invalid option -- 'c' , entonces debe agregar el -- .
Los argumentos para Tini deben aprobarse como -v en el siguiente ejemplo: /tini -v -- /your/program .
Nota: El binario vinculado anteriormente es un binario vinculado dinámicamente de 64 bits.
Los binarios tini y tini-static está firmados utilizando la clave 595E85A6B1B4779EA4DAAEC70B588DFF0527A9B7 .
Puede verificar sus firmas usando gpg (que puede instalar usando su Administrador de paquetes):
ENV TINI_VERSION v0.19.0
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini.asc /tini.asc
RUN gpg --batch --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 595E85A6B1B4779EA4DAAEC70B588DFF0527A9B7
&& gpg --batch --verify /tini.asc /tini
RUN chmod +x /tini
Los binarios de tini y tini-static han generado suma de verificación ( SHA1 y SHA256 ).
Puede verificar sus sumas de verificación utilizando sha1sum y sha256sum (que puede instalar usando su Administrador de paquetes):
ENV TINI_VERSION v0.19.0
RUN wget --no-check-certificate --no-cookies --quiet https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-amd64
&& wget --no-check-certificate --no-cookies --quiet https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-amd64.sha256sum
&& echo "$(cat tini-amd64.sha256sum)" | sha256sum -c
En Alpine Linux, puede usar el siguiente comando para instalar Tini:
RUN apk add --no-cache tini
# Tini is now available at /sbin/tini
ENTRYPOINT ["/sbin/tini", "--"]
Usando NIX, puede usar el siguiente comando para instalar TINI:
nix-env --install tini
En Debian (Buster o más nuevo), puede usar el siguiente comando para instalar Tini:
apt-get install tini
Tenga en cuenta que esto se instala /usr/bin/tini (y /usr/bin/tini-static ), no /tini .
En Arch Linux, hay un paquete disponible en el AUR. Instalar utilizando las instrucciones oficiales o use un ayudante AUR:
pacaur -S tini
¡El brazo y los binarios de 32 bits están disponibles! Puede encontrar la lista completa de binarios disponibles en la pestaña Lanzamientos.
El argumento -v se puede usar para una salida verbosa extra (puede pasarlo hasta 3 veces, por ejemplo, -vvv ).
Por defecto, Tini necesita ejecutarse como PID 1 para que pueda cosechar zombies (ejecutando como PID 1, los zombies se vuelven a igualar a Tini).
Si por alguna razón, no puede ejecutar TINI como PID 1, debe registrar TINI como un proceso subreaval (solo en Linux> = 3.4), por cualquiera:
-s a Tini ( tini -s -- ... )TINI_SUBREAPER (por ejemplo, export TINI_SUBREAPER= ).Esto asegurará que los zombis se vuelvan a igualar a Tini a pesar de que Tini no se ejecuta como PID 1.
Nota: Tini emitirá una advertencia si detecta que no se está ejecutando como PID 1 y no está registrado como un subreavador. Si no ves una advertencia, estás bien.
Tini reutilizará el código de salida del niño cuando salga, pero ocasionalmente, esto puede no ser exactamente lo que desea (por ejemplo, si su hijo sale con 143 después de recibir Sigterm). En particular, esto puede ser un problema con las aplicaciones Java.
En este caso, puede usar el indicador -e para reasignar un código de salida arbitrario a 0. Puede pasar el indicador varias veces si es necesario.
Por ejemplo:
tini -e 143 -- ...
Por defecto, Tini solo mata su proceso infantil inmediato. Esto puede ser inconveniente si enviar una señal a ese proceso no tiene el efecto deseado. Por ejemplo, si lo haces
docker run krallin/ubuntu-tini sh -c 'sleep 10'
Y Ctrl-c it, no pasa nada: Sigint se envía al proceso 'sh', pero esa caparazón no reacciona a él mientras espera que termine el 'sueño'.
Con la opción -g , Tini mata al grupo de procesos infantiles, de modo que cada proceso en el grupo obtenga la señal. Esto corresponde más estrechamente a lo que sucede cuando hace CTRL-C, etc. en un terminal: la señal se envía al grupo de procesos de primer plano.
Tini puede establecer su señal de muerte principal, que es la señal que Tini debe recibir cuando su padre sale. Para establecer la señal de muerte principal, use el indicador -p con el nombre de la señal que Tini debe recibir cuando su padre salga:
tini -p SIGTERM -- ...
Nota: Vea esta discusión de relaciones públicas para obtener más información sobre la señal de muerte principal y los casos de uso.
¡Tini también se puede usar con un punto de entrada existente en su contenedor!
Suponiendo que su punto de entrada fuera /docker-entrypoint.sh , entonces usaría:
ENTRYPOINT ["/tini", "--", "/docker-entrypoint.sh"]
Tini tiene muy pocas dependencias (solo depende de LIBC), pero si su contenedor no se inicia, es posible que desee considerar usar la versión construida por estática: en su lugar:
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-static /tini
Tini es un archivo muy pequeño (en el rango de 10 kb), por lo que no agrega mucho peso a su contenedor.
La versión estadísticamente vinculada es más grande, pero aún <1m.
Si prefiere no descargar el binario, puede construir TINI ejecutando cmake . && make .
Antes de construir, probablemente también quieras correr:
export CFLAGS="-DPR_SET_CHILD_SUBREAPER=36 -DPR_GET_CHILD_SUBREAPER=37"
Esto asegura que incluso si se está construyendo en un sistema que tiene viejos encabezados del núcleo de Linux (<3.4), Tini se construirá con soporte infantil subreaval. Esto suele ser lo que desea si va a usar Tini con Docker (si su núcleo anfitrión es compatible con Docker, también debe admitir subreapers infantiles).
Después de generar su proceso, Tini esperará las señales y enviarálas al proceso infantil, y periódicamente coserá procesos de zombie que pueden crearse dentro de su contenedor.
Cuando el "primer" proceso infantil sale ( /your/program en los ejemplos anteriores), Tini también sale, con el código de salida del proceso infantil (por lo que puede verificar el código de salida de su contenedor para saber si el niño salió con éxito).
Si algo no funciona como espere, considere aumentar el nivel de verbosidad (hasta 3):
tini -v -- bash -c 'exit 1'
tini -vv -- true
tini -vvv -- pwd
Mantenedor:
Colaboradores:
Un agradecimiento especial a: