init minuscule mais valable pour les conteneurs Tini est l' init la plus simple à laquelle vous pourriez penser.
Tout ce que Tini fait est en train d'apparier un seul enfant (Tini est censé être exécuté dans un conteneur), et attendez qu'il quitte tout en récoltant les zombies et en effectuant un transfert de signal.
L'utilisation de Tini a plusieurs avantages:
SIGTERM termine correctement votre processus même si vous n'avez pas explicitement installé un gestionnaire de signaux.Si vous souhaitez plus de détails sur les raisons pour lesquelles cela est utile, passez en revue ce problème Discussion: Quel est l'avantage de Tini ?.
Remarque: Si vous utilisez Docker 1.13 ou plus, Tini est inclus dans Docker lui-même. Cela comprend toutes les versions de Docker CE. Pour activer Tini, passez simplement le drapeau --init à docker run .
Remarque: Il existe des images docker prédéfinies disponibles pour Tini. Si vous utilisez actuellement une image Ubuntu ou CentOS comme base, vous pouvez en utiliser l'une en remplacement de rendez-vous.
Remarque: Il existe des packages Tini pour Alpine Linux et Nixos. Voir ci-dessous pour les instructions d'installation.
Ajoutez Tini à votre conteneur et faites-le exécutable. Ensuite, invoquez simplement Tini et passez votre programme et ses arguments comme arguments à Tini.
Dans Docker, vous voudrez utiliser un point d'entrée afin que vous n'ayez pas à vous rappeler d'invoquer manuellement 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 ...
Notez que vous pouvez ignorer -- dans certaines conditions, mais vous pourriez tout aussi bien l'inclure pour être en sécurité. Si vous voyez un message d'erreur qui ressemble à tini: invalid option -- 'c' , vous devez ajouter le -- .
Les arguments pour Tini lui-même doivent être passés comme -v dans l'exemple suivant: /tini -v -- /your/program .
Remarque: le binaire lié ci-dessus est un binaire lié à 64 bits.
Les binaires tini et tini-static sont signés en utilisant la clé 595E85A6B1B4779EA4DAAEC70B588DFF0527A9B7 .
Vous pouvez vérifier leurs signatures à l'aide de gpg (que vous pouvez installer en utilisant votre gestionnaire de packages):
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
Les binaires tini et tini-static ont généré des sommes de contrôle ( SHA1 et SHA256 ).
Vous pouvez vérifier leurs sommes de contrôle à l'aide de sha1sum et sha256sum (que vous pouvez installer en utilisant votre gestionnaire de packages):
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
Sur Alpine Linux, vous pouvez utiliser la commande suivante pour installer Tini:
RUN apk add --no-cache tini
# Tini is now available at /sbin/tini
ENTRYPOINT ["/sbin/tini", "--"]
En utilisant NIX, vous pouvez utiliser la commande suivante pour installer Tini:
nix-env --install tini
Sur Debian (Buster ou plus récent), vous pouvez utiliser la commande suivante pour installer Tini:
apt-get install tini
Notez que cela installe /usr/bin/tini (et /usr/bin/tini-static ), pas /tini .
Sur Arch Linux, un package est disponible sur l'AUR. Installez en utilisant les instructions officielles ou utilisez une aide AUR:
pacaur -S tini
Des binaires de bras et 32 bits sont disponibles! Vous pouvez trouver la liste complète des binaires disponibles dans l'onglet des versions.
L'argument -v peut être utilisé pour une sortie verbale supplémentaire (vous pouvez la transmettre jusqu'à 3 fois, par exemple -vvv ).
Par défaut, Tini doit fonctionner en tant que PID 1 afin qu'il puisse récolter les zombies (en fonctionnant en PID 1, les zombies sont réparés à Tini).
Si pour une raison quelconque, vous ne pouvez pas exécuter TINI sous le nom de PID 1, vous devez enregistrer Tini en tant que sous-récepteur de processus à la place (uniquement dans Linux> = 3,4), par l'un ou l'autre:
-s à Tini ( tini -s -- ... )TINI_SUBREAPER (par exemple, export TINI_SUBREAPER= ).Cela garantira que les zombies sont réparés à Tini malgré le tini de ne pas fonctionner comme PID 1.
Remarque: TINI émettra un avertissement s'il détecte qu'il ne fonctionne pas en tant que PID 1 et n'est pas enregistré comme sous-récepteur. Si vous ne voyez pas d'avertissement, tout va bien.
Tini réutilisera le code de sortie de l'enfant à la sortie, mais parfois, ce n'est peut-être pas exactement ce que vous voulez (par exemple si votre enfant sort avec 143 après avoir reçu SIGTERM). Notamment, cela peut être un problème avec les applications Java.
Dans ce cas, vous pouvez utiliser l'indicateur -e pour remapper un code de sortie arbitraire sur 0. Vous pouvez transmettre l'indicateur plusieurs fois si nécessaire.
Par exemple:
tini -e 143 -- ...
Par défaut, Tini ne tue que son processus enfant immédiat. Cela peut être gênant si l'envoi d'un signal à ce processus n'a pas l'effet souhaité. Par exemple, si vous faites
docker run krallin/ubuntu-tini sh -c 'sleep 10'
Et ctrl-c it, rien ne se passe: Sigint est envoyé au processus «sh», mais cette coquille ne réagira pas pendant qu'il attend que le «sommeil» se termine.
Avec l'option -g , Tini tue le groupe de processus enfants, de sorte que chaque processus du groupe obtient le signal. Cela correspond plus étroitement à ce qui se passe lorsque vous faites Ctrl-C, etc. Dans un terminal: le signal est envoyé au groupe de processus de premier plan.
Tini peut définir son signal de mort parent, qui est le signal que Tini devrait recevoir lorsque son parent sort. Pour définir le signal de mort parent, utilisez l'indicateur -p avec le nom du signal Tini devrait recevoir lorsque son parent sort:
tini -p SIGTERM -- ...
Remarque: Voir cette discussion PR pour en savoir plus sur le signal de mort des parents et les cas d'utilisation.
Tini peut également être utilisé avec un point d'entrée existant dans votre conteneur!
En supposant que votre point d'entrée était /docker-entrypoint.sh , alors vous utiliseriez:
ENTRYPOINT ["/tini", "--", "/docker-entrypoint.sh"]
Tini a très peu de dépendances (cela ne dépend que de la libc), mais si votre conteneur ne commence pas, vous voudrez peut-être envisager d'utiliser la version statiquement construite:
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-static /tini
Tini est un très petit fichier (dans la plage de 10 kb), donc il n'ajoute pas beaucoup de poids à votre conteneur.
La version liée au statique est plus grande, mais toujours <1m.
Si vous préférez ne pas télécharger le binaire, vous pouvez construire Tini en exécutant cmake . && make .
Avant la construction, vous voulez probablement aussi courir:
export CFLAGS="-DPR_SET_CHILD_SUBREAPER=36 -DPR_GET_CHILD_SUBREAPER=37"
Cela garantit que même si vous construisez sur un système qui a d'anciens en-têtes de noyau Linux (<3,4), Tini sera construit avec un support de sous-récepteur d'enfants. C'est généralement ce que vous voulez si vous allez utiliser Tini avec Docker (si votre noyau hôte prend en charge Docker, il devrait également soutenir les sous-récipients des enfants).
Après avoir engendré votre processus, Tini attendra les signaux et transmettra-les au processus de l'enfant, et récoltera périodiquement les processus de zombies qui peuvent être créés dans votre conteneur.
Lorsque le «premier» processus enfant sort ( /your/program dans les exemples ci-dessus), TINI sort également, avec le code de sortie du processus de l'enfant (afin que vous puissiez vérifier le code de sortie de votre conteneur pour savoir si l'enfant est sorti avec succès).
Si quelque chose ne fonctionne pas comme vous vous y attendez, pensez à augmenter le niveau de verbosité (jusqu'à 3):
tini -v -- bash -c 'exit 1'
tini -vv -- true
tini -vvv -- pwd
HEUPTENER:
Contributeurs:
Un merci spécial à: