Was ist ein Docker-Image-Manifest?

0
218

Docker-Manifeste beschreiben die Ebenen in einem Bild. Ein Manifest ermöglicht den genauen Vergleich zweier Bilder, auch wenn ihnen unterschiedliche Tags zugewiesen sind.

Manifeste werden in JSON ausgedrückt und enthalten Informationen über die Ebenen und Architekturen des Bildes. Der Docker-Client verwendet Manifeste, um herauszufinden, ob ein Image mit dem aktuellen Gerät kompatibel ist. Es verwendet dann die Informationen, um zu bestimmen, wie neue Container gestartet werden.

Das Manifest-Format

Das Manifest-Schema hat derzeit Version 2. Eine vollständige Datei deklariert ihre Schemaversion und dann eine Liste der für das Image verfügbaren Manifest-Einträge. Jeder Eintrag stellt eine andere Variante des Images dar, z. B. x86 und ARM64.

Sie können das Manifest jedes Images mit dem Befehl docker manifest inspect anzeigen. Dies funktioniert sowohl mit lokalen Images als auch mit Images, die in einer Remote-Registrierung wie Docker Hub gespeichert sind.

docker manifest inspect my-image:latest

Das Manifest ist eine Liste von Ebenen, die im Bild enthalten sind. Sie können den Hash des Inhalts der Ebene und seine Gesamtgröße sehen.

Werbung

Wenn Sie das Flag –verbose hinzufügen, erhalten Sie noch mehr Informationen über das Bild. Dazu gehören das Tag des Images (im Feld Ref), seine Architektur und sein Betriebssystem.

Docker lädt standardmäßig keine Manifestdetails aus unsicheren Registrys. Wenn Sie eine nicht ordnungsgemäß gesicherte Registrierung verwenden müssen, fügen Sie das Flag –insecure zu Ihren Docker-Manifest-Befehlen hinzu.

Manifeste und Multi-Arch-Builds

In der Vergangenheit unterstützte Docker nicht mehrere Image-Architekturen. Bilder konnten nur auf Maschinen mit der gleichen Architektur verwendet werden, auf der sie erstellt wurden. Dies erwies sich schnell als einschränkend, da Docker in Serverumgebungen und auf neueren ARM-basierten Maschinen mehr Verwendung fand.

Manifeste ermöglichen nicht nur die eindeutige Identifizierung von Bildern, sondern erleichtern auch Multi-Architektur-Builds. Wenn Sie ein Image überprüfen, das mehrere Architekturen unterstützt, sehen Sie eine leicht unterschiedliche Manifestausgabe:

docker manifest inspect php:latest

Wenn Sie den obigen Befehl ausführen, wird das Manifest für das offizielle PHP Docker-Image angezeigt. Sie können dem Screenshot entnehmen, dass mehrere Plattformoptionen verfügbar sind, einschließlich AMD64 und ARM. Wir haben die vollständige Liste gekürzt, die tatsächlich acht verschiedene unterstützte Architekturen enthält.

< /p>

Manifeste ermöglichen es Bildautoren, die Unterstützung für mehrere Architekturen unter einem Bild-Tag zu bewerben. Der Docker-Client wählt basierend auf den Optionen in der Liste die geeignete Image-Version für seine Plattform aus. Es wird erwartet, dass Autoren nur Bilder gruppieren, die identische Funktionen bieten – Es sollte keine Änderungen über die Zielarchitektur oder das Betriebssystem hinaus geben.

Werbung

Jede Architektur in der Liste verweist über ihr Digest-Feld auf ein anderes Manifest. Das Manifest, auf das verwiesen wird, ist eine normale Datei mit einer einzelnen Architektur. Docker ordnet die aktuelle Plattform dem richtigen Single-Arch-Manifest zu und lädt dann diese Datei, um die endgültige Liste der Image-Layer zu bestimmen.

Mit dem Docker-Manifest-Befehl können Sie Images mit mehreren Architekturen manuell erstellen. Erstellen Sie jedes der einzelnen Images und verschieben Sie sie in eine Registry. Verwenden Sie dann den Befehl docker manifest create, um die Bilder in einem neuen freigegebenen Manifest unter einem einzigen Tag zu kombinieren.

# auf einem AMD64-Computer docker build -t my-image:amd64 . docker push my-image:amd64 # auf einer ARM-Maschine docker build -t my-image:arm . docker push my-image:arm # jetzt die Manifeste kombinieren docker manifest create my-image:latest –amend my-image:x64 –amend my-image:arm docker manifest push my-image:latest

Wenn Sie manifest create mit dem Flag –amend verwenden, können Sie mehrere unabhängige Manifeste zusammenführen. Das endgültige Manifest wird dann mit dem neuesten Tag an Docker Hub übertragen. Sowohl AMD64- als auch ARM-Benutzer können Container aus diesem Image erstellen.

Das manuelle Zusammenstellen von Multi-Arch-Images ist nicht zwingend erforderlich. Sie können stattdessen den Befehl buildx verwenden, um den Vorgang erheblich zu vereinfachen.

docker buildx build –platform linux/amd64,linux/arm64/v8 –tag my-image:latest

Dieser einzelne Befehl führt zu einem Image das funktioniert sowohl auf AMD64- als auch auf ARM64-Plattformen. Unter der Haube wird immer noch eine Manifestliste mit mehreren Arches erstellt, daher ist es hilfreich, das Innenleben der Verknüpfung von Bildern zu verstehen.

Manifeste mit Anmerkungen versehen

Mit Docker können Sie Manifestdaten manuell durch Anmerkungen überschreiben. Zu den unterstützten Feldern gehören Architektur- und Betriebssysteminformationen.

Werbung

Verwenden Sie den Befehl docker manifest annotate, um Anmerkungen einzurichten. Wenn Sie ein Image mit einer einzelnen Architektur mit Anmerkungen versehen, geben Sie ein Image-Tag an, das darauf verweist. Für Multi-Arch-Images benötigen Sie sowohl das allgemeine Image-Tag als auch das Tag des einzelnen Manifests in der Multi-Arch-Manifestliste.

docker manifest annotate my-image:latest my-image:amd64 – -os-version linux

Dieser Befehl markiert die AMD64-Version des my-image:latest-Images als Linux-basierten Container.

Anmerkungen müssen nicht oft von Hand gesetzt werden. Sie werden normalerweise automatisch aus der Build-Umgebung abgeleitet. Mit dem Annotate-Befehl können Sie in Zukunft fehlende Felder hinzufügen oder die Bildkonfiguration ändern.

Zusammenfassung

Docker-Manifeste beschreiben die Ebenen eines Bilds und die unterstützten Architekturen. Ein Manifest kann entweder eine einzelne Architektur sein, die eine bestimmte Plattform unterstützt, oder eine Multi-Architektur. Im letzteren Fall enthält die Datei eine Liste mit Verweisen auf die darin enthaltenen Single-Arch-Manifeste.

Manuelle Interaktion mit Manifesten sollte selten sein, ist aber mit der Docker-Manifest-Befehlsgruppe möglich. Es ist jetzt üblicher, Multi-Arch-Builds über Buildx zu automatisieren, was eine vereinfachte Manifest-Assembly-Erfahrung bietet.