ONBUILD
von Docker Anweisung können Sie Trigger innerhalb eines Bildes einrichten. Ihre Trigger werden später ausgeführt, wenn das Bild als Basis für ein anderes verwendet wird. Sie werden Teil des neuen Downstream-Image-Kontexts und sind keine Dateisystemschichten in Ihrem anfänglichen docker build
.
Hinzufügen von ONBUILD-Triggern
ONBUILD
ist eine Anweisung, die Sie in Ihre Dockerfiles schreiben. Es ist einzigartig, da es andere akzeptiert Anweisung als Argument. Sie können einen beliebigen Dockerfile-Vorgang angeben, z. B. COPY
oder RUN
, und lassen Sie es während eines Downstream-Image-Builds ausführen.
ONBUILD RUN example-command
Dieses Beispiel führt example-command
aus im untergeordneten Image zum Zeitpunkt der Erstellung. Hier ist ein weiterer Fall, in dem eine Datei aus dem Build-Kontext des Downstream-Images in das Dateisystem kopiert wird:
ONBUILD COPY assets.json /app/assets.json
ONBUILD
Anweisungen haben keinerlei Auswirkung auf das Image, das von der Docker-Datei erzeugt wird, in der sie definiert sind. Das Erstellen der obigen Docker-Datei würde nicht Führen Sie example-command
aus oder binden Sie assets.json
ein im Bild:
# Does not include the extra instructions docker build -t base-image:latest .
Die Trigger werden verwendet, wenn Sie eine weitere Docker-Datei schreiben, die die erste als Basis verwendet:
FROM base-image:latest RUN my-binary
docker build -t downstream-image:latest .
Beim Erstellen dieser Docker-Datei wird example-command
ausgeführt , kopieren Sie assets.json
hinein , und führen Sie schließlich my-binary
aus . Der ONBUILD
Trigger werden immer zuerst ausgeführt, unmittelbar nach dem FROM
Anweisung im Downstream-Dockerfile.
Wie erkennt Docker Trigger?
ONBUILD
wirkt sich nicht auf das Dateisystem des Basiscontainers aus, aber Docker weiß immer noch, dass Trigger vorhanden sind, wenn Sie ein Downstream-Image erstellen. Der Erstellungsprozess verfolgt ONBUILD
Anweisungen, die es findet und in den Metadaten des Bildes aufzeichnet.
Docker untersucht die Metadaten der Bilder, auf die in einem FROM
verwiesen wird Anweisung. Wenn das benannte Image Trigger in seinen Metadaten enthält, werden diese Trigger-Anweisungen effektiv an den Anfang der Downstream-Dockerfile eingefügt, bevor der Build beginnt.
Trigger werden tatsächlich als Teil des FROM
des Builds ausgeführt Bühne. Sie werden in der Reihenfolge ausgeführt, in der sie in das Upstream-Dockerfile geschrieben wurden. Wenn ein ONBUILD
Anweisung fehlschlägt, bricht Docker den Build ab und es sieht aus wie FROM
Bühne war die Ursache.
Einschränkungen
Sie können jede Dockerfile-Anweisung als Argument für ein ONBUILD
verwenden Trigger mit drei Ausnahmen:
ONBUILD FROM
– Dies ist nicht zulässig, da es das für den Build verwendete Basis-Image überschreiben würde. Jedes Dockerfile muss von einer einzigen Basis erben.ONBUILD MAINTAINER
– DerMAINTAINER
Anweisung ist veraltet und sollte nicht verwendet werden; Angaben zur Urheberschaft werden am besten als Label geliefert. DasLABEL
Anweisung ist kompatibel mitONBUILD
.ONBUILD ONBUILD
– Verkettung vonONBUILD
Anweisungen werden nicht unterstützt. Alle Trigger werden im Image unmittelbar nach Ihrem Dockerfile ausgeführt. Sie können keine Trigger definieren, die in „Enkel“-Images zwei oder mehr Ebenen unterhalb der definierenden Dockerfile ausgeführt werden sollen.
Alle Befehle sind genauso definiert wie ihre reguläre Verwendung. Schreiben Sie einen gewöhnlichen Schritt in Ihr Dockerfile und stellen Sie ihm dann ONBUILD
voran , verschiebt es aus dem normalen Build-Flow und macht es stattdessen zu einem Downstream-Build-Trigger.
Wann sind ONBUILD-Trigger nützlich?
ONBUILD
wird am häufigsten in Utility-Images verwendet, die Aufgaben wie die Codekompilierung automatisieren. Diese Art von Verfahren erfordert im Allgemeinen die Ausführung mehrerer Schritte in einer bestimmten Reihenfolge, wobei Abhängigkeiten wie Ihr Quellcode an einer bestimmten Stelle hinzugefügt werden.
Stellen Sie sich ein Kompilierungs-Image vor, das in einem Verzeichnis nach Quellcode sucht und dann einen Befehl ausführt, um es zu erstellen. Sie können nicht einfach COPY
und RUN
innerhalb des Dockerfiles dieses Bildes, da die Quelle des Endbenutzers nicht in Ihrem existieren würde Build-Kontext des Bildes.
Verwenden von ONBUILD
können Sie eine Boilerplate Dockerfile bereitstellen, die Ihre Benutzer erweitern und docker build
können ohne gemeinsame Funktionalität neu zu erfinden:
ENV BUILD_ENV=production RUN init-build.sh ONBUILD COPY /src /build ONBUILD RUN compile.sh --destination=/bin
Dieses Beispiel zeigt, wie ein Builder-Image eine vorkonfigurierte Kompilierungsumgebung bereitstellen könnte. Bei Verwendung als Basisimage wird Code automatisch aus dem nachgelagerten Buildkontext kompiliert. Dieses Bild könnte mit der kompilierten Ausgabe in /bin
interagieren innerhalb seiner eigenen Dockerfile-Stufen.
Zusammenfassung
ONBUILD
Anweisungen in Dockerfiles geben Ihnen die Möglichkeit, Trigger als Teil eines Downstream-Builds auszuführen. Sie können jede andere Dockerfile-Anweisung als ONBUILD
verwenden Trigger, abgesehen von einigen Einschränkungen.
Verwenden von ONBUILD
können Sie generische Docker-Images bereitstellen, die wiederverwendbare Sätze von Funktionen definieren. Dies ist effizienter, als Benutzer den Text von Beispiel-Dockerfiles wörtlich kopieren zu lassen und dann ihre eigenen Anweisungen unten hinzuzufügen. Sie können das Basis-Image immer noch ändern und aktualisieren, ohne dass Ihre Benutzer etwas unternehmen müssen.
Annahme von ONBUILD
reduziert Wiederholungen und erleichtert erweiterbare Docker-Basisimages. ONBUILD
Anweisungen sind eine Überlegung wert, wenn Sie ein Boilerplate-Dockerfile erstellen, das von Endbenutzern angepasst werden muss, bevor die endgültige Containerumgebung als vollständig angesehen wird.