init für Behälter Tini ist der einfachste init , den Sie sich vorstellen können.
Alles, was Tini tut, ist, ein einzelnes Kind zu erzeugen (Tini soll in einem Behälter ausgeführt werden) und warten, bis es die Zombies macht und die Signalweiterung durchführt.
Die Verwendung von Tini hat mehrere Vorteile:
SIGTERM Ihren Prozess ordnungsgemäß ordnungsgemäß ordnungsgemäß, auch wenn Sie einen Signalhandler nicht explizit installiert haben.Wenn Sie mehr Details darüber möchten, warum dies nützlich ist, überprüfen Sie diese Ausgabediskussion: Was ist der Vorteil von Tini?.
Hinweis: Wenn Sie Docker 1.13 oder mehr verwenden, ist Tini in Docker selbst enthalten. Dies schließt alle Versionen von Docker CE ein. Um Tini zu aktivieren, übergeben Sie einfach die Flagge --init an docker run .
Hinweis: Für Tini stehen vorgefertigte Docker-Bilder zur Verfügung. Wenn Sie derzeit ein Ubuntu- oder CentOS-Bild als Basis verwenden, können Sie einen dieser als Drop-In-Ersatz verwenden.
Hinweis: Es gibt Tini -Pakete für Alpine Linux und Nixos. Siehe unten für Installationsanweisungen.
Fügen Sie Tini zu Ihrem Behälter hinzu und machen Sie es ausführbar. Rufen Sie dann einfach Tini auf und geben Sie Ihr Programm und seine Argumente als Argumente an Tini weiter.
In Docker möchten Sie einen Einstiegspunkt verwenden, damit Sie nicht daran denken müssen, Tini manuell aufzurufen:
# 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 ...
Beachten Sie, dass Sie die -- unter bestimmten Bedingungen überspringen können , aber Sie können sie immer immer einschließen, um sicher zu sein. Wenn Sie eine Fehlermeldung sehen, die wie tini: invalid option -- 'c' , müssen Sie die -- hinzufügen.
Argumente für Tini selbst sollten im folgenden Beispiel wie -v bestanden werden: /tini -v -- /your/program .
HINWEIS: Das oben verknüpfte binäre ist ein 64-Bit-Dynamik-Binärer.
Die tini und tini-static Binärdateien werden unter Verwendung des Schlüssels 595E85A6B1B4779EA4DAAEC70B588DFF0527A9B7 unterzeichnet.
Sie können ihre Signaturen mit gpg (die Sie mit Ihrem Paketmanager installieren können) überprüfen.
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
Die tini und tini-static Binärdateien haben Prüfsummen ( SHA1 und SHA256 ) erzeugt.
Sie können ihre Prüfsummen über sha1sum und sha256sum (die Sie mit Ihrem Paketmanager installieren können) überprüfen:
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
Unter Alpine Linux können Sie den folgenden Befehl verwenden, um Tini zu installieren:
RUN apk add --no-cache tini
# Tini is now available at /sbin/tini
ENTRYPOINT ["/sbin/tini", "--"]
Mit NIX können Sie den folgenden Befehl verwenden, um Tini zu installieren:
nix-env --install tini
Auf Debian (Buster oder neuer) können Sie den folgenden Befehl verwenden, um Tini zu installieren:
apt-get install tini
Beachten Sie, dass dies /usr/bin/tini (und /usr/bin/tini-static ), nicht /tini , installiert wird.
Unter Arch Linux gibt es ein Paket auf der AUR. Installieren Sie mit den offiziellen Anweisungen oder verwenden Sie einen AUR -Helfer:
pacaur -S tini
Arm- und 32-Bit-Binärdateien sind verfügbar! Die vollständige Liste der verfügbaren Binärdateien finden Sie auf der Registerkarte Releases.
Das -v -Argument kann für die zusätzliche ausführliche Ausgabe verwendet werden (Sie können es bis zu dreimal übergeben, z. B. -vvv ).
Standardmäßig muss Tini als PID 1 ausgeführt werden, damit es Zombies ernten kann (indem sie als PID 1 ausgeführt werden, werden Zombies wieder an Tini unterzogen).
Wenn Sie aus irgendeinem Grund Tini nicht als PID 1 ausführen können, sollten Sie Tini stattdessen als Prozess -Subre -Deal (nur unter Linux> = 3.4) durch beide registrieren:
-s an Tini ( tini -s -- ... )TINI_SUBREAPER (z. B. export TINI_SUBREAPER= ).Dadurch wird sichergestellt, dass Zombies, obwohl Tini nicht als PID 1 läuft.
HINWEIS: TINI wird eine Warnung ausgeben, wenn festgestellt wird, dass es nicht als PID 1 ausgeführt wird und nicht als Subrabschnitt registriert wird. Wenn Sie keine Warnung sehen, geht es dir gut.
Tini wird den Ausstiegscode des Kindes beim Verlassen wiederverwenden, aber gelegentlich ist dies möglicherweise nicht genau das, was Sie wollen (z. B. wenn Ihr Kind nach Erhalt von Sigterm mit 143 nachgibt). Insbesondere kann dies ein Problem bei Java -Apps sein.
In diesem Fall können Sie das -e -Flag verwenden, um einen willkürlichen Exit -Code auf 0 neu zu gestalten. Sie können das Flag bei Bedarf mehrmals übergeben.
Zum Beispiel:
tini -e 143 -- ...
Standardmäßig tötet Tini nur seinen unmittelbaren Kinderprozess. Dies kann unpraktisch sein, wenn das Senden eines Signals an diesen Prozess nicht den gewünschten Effekt hat. Zum Beispiel, wenn Sie dies tun
docker run krallin/ubuntu-tini sh -c 'sleep 10'
Und Strg-c Es passiert nichts: Sigint wird an den "SH" -Prozess gesendet, aber diese Shell reagiert nicht darauf, während sie darauf wartet, dass der Schlaf "schläft".
Mit der Option -g tötet Tini die Kinderprozessgruppe, so dass jeder Prozess in der Gruppe das Signal erhält. Dies entspricht genauer, was passiert, wenn Sie Strg-C usw. in einem Terminal durchführen: Das Signal wird an die Vordergrundprozessgruppe gesendet.
Tini kann sein übergeordnetes Todessignal einstellen, das die Signal -Tini empfangen sollte, wenn seine übergeordneten Ausgaben gehen. Verwenden Sie zum Einstellen des übergeordneten Todessignals das -p -Flag mit dem Namen des Signal -Tini, wenn der Elternteil geht:
tini -p SIGTERM -- ...
HINWEIS: Sehen Sie sich diese PR -Diskussion an, um mehr über das Elterntodsignal und die Anwendungsfälle zu erfahren.
Tini kann auch mit einem vorhandenen Einstiegspunkt in Ihrem Container verwendet werden!
Unter der Annahme, dass Ihr Einstiegspunkt /docker-entrypoint.sh war, würden Sie verwenden:
ENTRYPOINT ["/tini", "--", "/docker-entrypoint.sh"]
Tini hat nur sehr wenige Abhängigkeiten (es hängt nur von LIBC ab). Wenn Ihr Container jedoch nicht startet, sollten Sie stattdessen in Betracht ziehen, die staatlich gebaute Version zu verwenden:
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-static /tini
Tini ist eine sehr kleine Datei (im Bereich von 10 KB), sodass Ihrem Behälter nicht viel Gewicht verleiht.
Die statisch verknüpfte Version ist größer, aber immer noch <1m.
Wenn Sie die Binärdatei lieber nicht herunterladen möchten, können Sie Tini bauen, indem Sie cmake . && make .
Vor dem Bau möchten Sie wahrscheinlich auch rennen:
export CFLAGS="-DPR_SET_CHILD_SUBREAPER=36 -DPR_GET_CHILD_SUBREAPER=37"
Dies sorgt dafür, dass Tini auch dann mit einem Kinder -Unterre -Schepper -Unterstützung gebaut wird, wenn Sie auf einem System mit alten Linux -Kernel -Headern (<3,4) aufbauen. Dies ist normalerweise das, was Sie wollen, wenn Sie Tini mit Docker verwenden möchten (wenn Ihr Host -Kernel Docker unterstützt, sollte es auch Kinder -Subtruppen unterstützen).
Nach dem Lebenden Ihres Prozesses wartet Tini auf Signale und leitet diese an den Kinderprozess weiter und erntet sich regelmäßig Zombie -Prozesse, die in Ihrem Behälter erstellt werden können.
Wenn der "erste" Kinderprozess ( /your/program in den obigen Beispielen) beendet, beendet Tini auch mit dem Ausgangscode des untergeordneten Prozesss (so können Sie den Exit -Code Ihres Containers überprüfen, um zu wissen, ob das Kind erfolgreich beendet wurde).
Wenn etwas nicht so funktioniert, wie Sie es erwarten, sollten Sie das Ausführungsniveau erhöhen (bis zu 3):
tini -v -- bash -c 'exit 1'
tini -vv -- true
tini -vvv -- pwd
Betreuer:
Mitwirkende:
Besonderer Dank an: