Wat is een Docker Image Manifest?

0
195

Docker-manifesten beschrijven de lagen in een afbeelding. Een manifest maakt een exacte vergelijking van twee afbeeldingen mogelijk, zelfs als er verschillende tags aan zijn toegewezen.

Manifesten worden uitgedrukt in JSON en bevatten informatie over de lagen en architecturen van de afbeelding. De Docker-client gebruikt manifesten om te bepalen of een afbeelding compatibel is met het huidige apparaat. Vervolgens gebruikt het de informatie om te bepalen hoe nieuwe containers moeten worden gestart.

The Manifest Format

Het manifestschema bevindt zich momenteel in versie 2. Een volledig bestand geeft de schemaversie aan en vervolgens een lijst met manifestvermeldingen die beschikbaar zijn voor de afbeelding. Elk item vertegenwoordigt een andere variant van de afbeelding, zoals x86 en ARM64.

U kunt het manifest van elke afbeelding bekijken met de opdracht docker manifest inspect. Dit werkt met zowel lokale afbeeldingen als afbeeldingen die zijn opgeslagen op een extern register zoals Docker Hub.

docker manifest inspect my-image:latest

Het manifest is een lijst met lagen die in de afbeelding zijn opgenomen. U kunt de hash van de inhoud van de laag en de totale grootte ervan zien.

Advertentie

Als je de –verbose vlag toevoegt, krijg je nog meer informatie over de afbeelding. Dit omvat de tag van de afbeelding (in het veld Ref), de architectuur en het besturingssysteem.

Docker laadt standaard geen manifestdetails van onveilige registers. Als u een onjuist beveiligd register moet gebruiken, voegt u de –insecure-vlag toe aan uw docker-manifestopdrachten.

Manifesten en multi-arch-builds

Historisch gezien ondersteunde Docker niet meerdere image-architecturen. Afbeeldingen konden alleen worden gebruikt op machines met dezelfde architectuur als waarop ze zijn gebouwd. Dit bleek al snel beperkend, aangezien Docker meer gebruik vond in serveromgevingen en op nieuwere op ARM gebaseerde machines.

Naast het mogelijk maken van unieke identificatie van afbeeldingen, vergemakkelijken manifesten multi-architectuur builds. Als u een afbeelding inspecteert die meerdere architecturen ondersteunt, ziet u een subtiel andere manifest-uitvoer:

docker manifest inspect php:latest

Als u de bovenstaande opdracht uitvoert, wordt het manifest voor de officiële PHP Docker-afbeelding weergegeven. U kunt aan de schermafbeelding zien dat er verschillende platformopties beschikbaar zijn, waaronder AMD64 en ARM. We hebben de volledige lijst ingekort, die in feite acht verschillende ondersteunde architecturen bevat.

< /p>

Met manifesten kunnen auteurs van afbeeldingen reclame maken voor ondersteuning voor meerdere architecturen onder één afbeeldingstag. De Docker-client selecteert de juiste imageversie voor zijn platform, op basis van de opties in de lijst. Er wordt verwacht dat auteurs alleen afbeeldingen groeperen die identieke functionaliteit bieden – er mogen geen wijzigingen zijn buiten de doelarchitectuur of het besturingssysteem.

Advertentie

Elke architectuur in de lijst verwijst naar een ander manifest via het digest-veld. Het manifest waarnaar wordt verwezen, is een normaal bestand met één architectuur. Docker koppelt het huidige platform aan het juiste single-arch-manifest en laadt vervolgens dat bestand om de definitieve lijst met afbeeldingslagen te bepalen.

U kunt handmatig multi-architectuurafbeeldingen maken met de opdracht docker-manifest. Bouw elk van de afzonderlijke afbeeldingen en push ze naar een register. Gebruik vervolgens de opdracht docker manifest create om de afbeeldingen te combineren tot een nieuw gedeeld manifest onder een enkele tag.

# op een AMD64-machine docker build -t my-image:amd64 . docker push my-image:amd64 # op een ARM-machine docker build -t my-image:arm . docker push my-image:arm # combineer nu de manifesten docker manifest create my-image:latest –amend my-image:x64 –amend my-image:arm docker manifest push my-image:latest

Als u manifest create gebruikt met de vlag –amend, kunt u meerdere onafhankelijke manifesten samenvoegen. Het definitieve manifest wordt vervolgens met de nieuwste tag naar Docker Hub gepusht. AMD64- en ARM-gebruikers kunnen beide containers maken van deze afbeelding.

Het handmatig samenstellen van multi-arch-afbeeldingen is niet verplicht. U kunt in plaats daarvan de opdracht buildx gebruiken om het proces aanzienlijk te vereenvoudigen.

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

Deze enkele opdracht resulteert in een afbeelding dat werkt op zowel AMD64- als ARM64-platforms. Onder de motorkap produceert het nog steeds een lijst met manifesten met meerdere bogen, dus het is handig om de innerlijke werking te begrijpen van hoe afbeeldingen aan elkaar worden gekoppeld.

Manifesten annoteren

Met Docker kun je handmatig manifestgegevens overschrijven via annotaties. De ondersteunde velden bevatten informatie over architectuur en besturingssysteem.

Advertentie

Gebruik de opdracht docker manifest annotate om annotaties in te stellen. Als u een afbeelding met één architectuur annoteert, geeft u een afbeeldingstag op die ernaar verwijst. Voor multi-arch-afbeeldingen heeft u zowel de algemene afbeeldingstag als de tag van het individuele manifest in de multi-arch-manifestlijst nodig.

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

Dit commando markeert de AMD64-versie van de my-image:latest image als een op Linux gebaseerde container.

Annotaties hoeven niet vaak met de hand te worden ingesteld. Ze worden meestal automatisch afgeleid uit de bouwomgeving. U kunt de opdracht annoteren gebruiken om in de toekomst ontbrekende velden toe te voegen of de afbeeldingsconfiguratie te wijzigen.

Samenvatting

Docker-manifesten beschrijven de lagen van een afbeelding en de architecturen die het ondersteunt. Een manifest kan een enkele architectuur zijn, die een specifiek platform ondersteunt, of een multi-architectuur. In het laatste geval bevat het bestand een lijst met verwijzingen naar de single-arch manifesten die het bevat.

Handmatige interactie met manifesten zou zeldzaam moeten zijn, maar is mogelijk met de docker-manifestopdrachtgroep. Het is nu gebruikelijker om multi-arch builds te automatiseren via Buildx, wat een vereenvoudigde manifest-assembly-ervaring biedt.