I manifesti Docker descrivono i livelli all'interno di un'immagine. Un manifest consente il confronto esatto di due immagini, anche se a cui sono assegnati tag diversi.
I manifest sono espressi in JSON e contengono informazioni sui livelli e sulle architetture dell'immagine. Il client Docker utilizza manifesti per determinare se un'immagine è compatibile con il dispositivo corrente. Quindi utilizza le informazioni per determinare come avviare nuovi contenitori.
Il formato manifesto
Lo schema manifest è attualmente alla versione 2. Un file completo dichiarerà la sua versione dello schema e quindi un elenco di voci manifest disponibili per l'immagine. Ogni voce rappresenta una variante diversa dell'immagine, come x86 e ARM64.
Puoi visualizzare il manifest di qualsiasi immagine utilizzando il docker manifest inspect
comando. Funziona sia con le immagini locali che con le immagini archiviate su un registro remoto come Docker Hub.
docker manifest inspect my-image:latest
Il manifest è un elenco di livelli inclusi nell'immagine. Puoi vedere l'hash del contenuto del livello e le sue dimensioni complessive.
Se aggiungi il --verbose
flag, otterrai ancora più informazioni sull'immagine. Ciò include il tag dell'immagine (in Ref
campo), la sua architettura e il suo sistema operativo.
Docker non caricherà i dettagli manifest da registri non sicuri per impostazione predefinita. Se devi utilizzare un registro protetto in modo non corretto, aggiungi il --insecure
segnala al tuo docker manifest
comandi.
Manifests e build multi-arco
Storicamente, Docker non supportava più architetture di immagini. Le immagini possono essere utilizzate solo su macchine con la stessa architettura di quella su cui sono state costruite. Ciò si è rapidamente rivelato limitante poiché Docker ha trovato un maggiore utilizzo negli ambienti server e sui nuovi computer basati su ARM.
Oltre a consentire l'identificazione univoca delle immagini, i manifest facilitano le build multi-architettura. Se esamini un'immagine che supporta più architetture, vedrai un output manifest leggermente diverso:
docker manifest inspect php:latest
L'esecuzione del comando precedente visualizzerà il manifest per l'immagine Docker PHP ufficiale. Puoi vedere dallo screenshot che sono disponibili diverse opzioni di piattaforma, tra cui AMD64 e ARM. Abbiamo troncato l'elenco completo che in realtà include otto diverse architetture supportate.
I manifesti consentono agli autori di immagini di pubblicizzare il supporto per più architetture sotto un unico tag immagine. Il client Docker seleziona la versione dell'immagine appropriata per la sua piattaforma, in base alle opzioni nell'elenco. Si prevede che gli autori raggrupperanno solo le immagini che offrono funzionalità identiche:non dovrebbero esserci modifiche oltre all'architettura o al sistema operativo di destinazione.
Ciascuna architettura nell'elenco fa riferimento a un'altra manifest tramite il suo digest
campo. Il manifest di riferimento sarà un normale file a architettura singola. Docker abbina la piattaforma corrente al manifest single-arch corretto, quindi carica il file per determinare l'elenco finale dei livelli dell'immagine.
Puoi creare manualmente immagini multi-architettura utilizzando il docker manifest
comando. Crea ciascuna delle singole immagini e inviale a un registro. Quindi usa la docker manifest create
comando per combinare le immagini in un nuovo manifest condiviso sotto un unico tag.
# on an AMD64 machine docker build -t my-image:amd64 . docker push my-image:amd64 # on an ARM machine docker build -t my-image:arm . docker push my-image:arm # now combine the manifests docker manifest create my-image:latest --amend my-image:x64 --amend my-image:arm docker manifest push my-image:latest
Usando manifest create
con il --amend
flag ti consente di unire più manifest indipendenti insieme. Il manifest finale viene quindi inviato a Docker Hub con l'latest
etichetta. Gli utenti AMD64 e ARM saranno entrambi in grado di creare contenitori da questa immagine.
L'assemblaggio manuale di immagini multi-arcata non è obbligatorio. Puoi usare il buildx
comando invece per semplificare notevolmente il processo.
docker buildx build --platform linux/amd64,linux/arm64/v8 --tag my-image:latest
Questo singolo comando si traduce in un'immagine che funziona su entrambe le piattaforme AMD64 e ARM64. Sotto il cofano, sta ancora producendo un elenco manifest multi-arch, quindi è utile capire il funzionamento interno di come le immagini vengono collegate tra loro.
Annotazione dei manifesti
Docker ti consente di sovrascrivere manualmente i dati manifest tramite le annotazioni. I campi supportati includono informazioni sull'architettura e sul sistema operativo.
Usa l'docker manifest annotate
comando per impostare le annotazioni. Se stai annotando un'immagine a architettura singola, fornisci un tag immagine che faccia riferimento ad essa. Per le immagini multi-arch, avrai bisogno sia del tag immagine generale che del tag del singolo manifest all'interno dell'elenco dei manifest multi-arch.
docker manifest annotate my-image:latest my-image:amd64 --os-version linux
Questo comando contrassegna la versione AMD64 di my-image:latest
immagine come contenitore basato su Linux.
Le annotazioni spesso non devono essere impostate manualmente. Di solito vengono dedotti automaticamente dall'ambiente di compilazione. Puoi usare l'annotate
comando per aggiungere campi mancanti o modificare la configurazione dell'immagine in futuro.
Riepilogo
I manifesti Docker descrivono i livelli di un'immagine e le architetture che supporta. Un manifest può essere un'architettura singola, che supporta una piattaforma specifica, o multi-architettura. In quest'ultimo caso, il file contiene un elenco di riferimenti ai manifest single-arch che incorpora.
L'interazione manuale con i manifest dovrebbe essere rara, ma è possibile con il docker manifest
gruppo di comando. Ora è più comune automatizzare build multi-arch tramite Buildx, che offre un'esperienza di assemblaggio manifest semplificata.