Che cos'è BuildKit di Docker e perché è importante?

Docker BuildKit è un motore di creazione di immagini opt-in che offre miglioramenti sostanziali rispetto il processo tradizionale. BuildKit crea livelli di immagini in parallelo, accelerando il processo di costruzione complessivo.

Cos'è BuildKit?

BuildKit è stato sviluppato come parte del progetto Moby, un tentativo di Docker di “assemblare sistemi di container specializzati senza reinventare la ruota.” È stato annunciato nel 2017 e ha iniziato a essere distribuito con Docker Engine nella versione 18.09 del 2018.

BuildKit si concentra sul miglioramento delle prestazioni della build, sulla gestione dello storage e sull'estensibilità. Le sue affermazioni principali sono l'elaborazione parallela, la memorizzazione nella cache più avanzata, un'architettura collegabile e la raccolta automatica dei rifiuti. Questi si combinano in un sistema di build più efficiente ed estensibile del motore originale.

I livelli che non si influenzano l'uno sull'altro possono essere costruiti contemporaneamente, riducendo i tempi di attesa per il completamento delle fasi. BuildKit ottimizza anche l'accesso ai file locali a cui fai riferimento con le istruzioni COPY. Tiene traccia delle modifiche apportate e copia solo i file che sono stati modificati dall'ultima build, invece di trasferire l'intero contesto di build.

BuildKit semplifica anche le build multipiattaforma. Puoi fornire il flag –platform per specificare i target per i quali costruire. BuildKit assemblerà automaticamente un manifest di immagine appropriato per coprire tutte le architetture specificate.

docker buildx –create –platform linux/amd64,linux/arm64 .

Come funziona BuildKit?

I miglioramenti delle prestazioni di BuildKit sono facilitati dall'uso di un formato di definizione build di basso livello, soprannominato LLB. È un formato binario basato su grafici che unisce definizioni di build complesse.

Pubblicità

Poiché i livelli sono collegati direttamente, BuildKit facilita il confronto più rapido dei grafici di build e del contenuto che includono. Il builder Dockerfile predefinito deve fare affidamento su un'euristica imprecisa per determinare se due immagini sono comparabili.

Il LLB è completamente separato dal BuildKit “frontend.” Il frontend prende una rappresentazione leggibile dall'uomo di un'immagine, come un Dockerfile, e la converte in un grafico LLB. Una volta generato, un LLB può essere esportato e spostato tra gli ambienti. L'esportazione in un registro consente ai client frontend di acquisire un LLB esistente per migliorare ulteriormente le prestazioni di compilazione per la prima volta.

I dettagli tecnici dell'LLB sono piuttosto complessi. La tecnologia sottostante si basa sulla teoria dei grafi e sul confronto del checksum. Non è necessario capirlo per trarre vantaggio dalla sua potenza: come utente finale, le build funzionano come sempre, con il comando docker build.

BuildKit crea ancora immagini conformi a OCI che sono portabili in diversi ambienti di container. Puoi usare BuildKit per creare qualsiasi immagine Docker con una base Linux. Le immagini Windows non sono attualmente supportate.

Attivazione del supporto BuildKit

Ci sono due modi per abilitare BuildKit. Se vuoi creare una singola immagine con la funzionalità, imposta la variabile d'ambiente DOCKER_BUILDKIT nella tua shell:

DOCKER_BUILDKIT=1 docker build . Annuncio

Per un uso a lungo termine, configura il demone Docker per utilizzare BuildKit per impostazione predefinita. Crea o modifica il file /etc/docker/daemon.json e aggiungi i seguenti contenuti all'oggetto di configurazione di primo livello:

{ "caratteristiche": { "buildkit": true } }

Ricarica la configurazione del demone per applicare la modifica:

systemctl reload docker

BuildKit verrà ora utilizzato al posto del motore di compilazione predefinito quando eseguire il comando docker build.

Puoi sapere quando BuildKit è attivo perché produce un output CLI diverso per il motore normale. La visualizzazione dei progressi di BuildKit offre una migliore leggibilità e una chiara visualizzazione dell'inizio e del completamento di ogni fase. Le informazioni includono una ripartizione del tempo impiegato per costruire ogni livello.

“docker buildx”

Puoi anche interagire con BuildKit tramite i comandi docker buildx. Questi useranno sempre BuildKit. Il gruppo di comandi dockerx espone funzionalità avanzate di BuildKit, inclusa la possibilità di creare su un host remoto.

Un singolo client BuildKit può interagire con diverse istanze del generatore di immagini distinte. Ciò facilita le build multipiattaforma consentendo di aggiungere un builder per ogni architettura a cui si mira.

Ecco un esempio di aggiunta di un host remoto come destinazione BuildKit. Ciò presuppone che la macchina di destinazione abbia un socket Docker esposto sulla porta TCP 2375. È possibile fare riferimento all'host utilizzando qualsiasi identificatore dell'endpoint Docker o il nome di un contesto Docker (ottenuto dal contesto docker ls). Quest'ultimo ti consente di costruire su ambienti cloud compatibili aggiungendoli come contesto.

docker buildx create –name remote-builder tcp://my-docker-host:2375 Advertisement

Puoi selezionare il builder da utilizzare con il comando docker buildx use:

docker buildx use remote- builder

Quindi puoi utilizzare il comando build per creare la tua immagine sull'istanza builder selezionata:

docker buildx build .

Puoi rimuovere le istanze del builder utilizzando docker buildx rm, passando il nome del builder. I costruttori sono elencati utilizzando la finestra mobile buildx ls; puoi usare docker buildx inspect per ottenere informazioni più dettagliate su un builder specifico.

Se vuoi controllare l'utilizzo del disco di BuildKit, esegui il comando docker buildx du. Puoi svuotare la cache di build per liberare spazio di archiviazione con docker buildx prune. Ciò potrebbe ridurre le prestazioni la prossima volta che ricostruirai l'immagine, poiché i livelli precedentemente memorizzati nella cache verranno ricostruiti.

Funzioni di compilazione

BuildKit aggiunge un paio di build extra funzioni temporali per semplificare i passaggi di Dockerfile.

Puoi passare i dati segreti usando il flag –secret. Ciò consente al tuo Dockerfile di accedere a valori sensibili senza memorizzarli all'interno dell'immagine. Il valore è disponibile solo in fase di compilazione.

docker build –secret id=demo-secret,src=demo-secret.txt . FROM my-image:latest RUN –mount=type=secret,id=demo-secret cat /run/secrets/demo-secrets Annuncio

Questo Dockerfile fa riferimento a un segreto chiamato demo-secret. Il suo valore viene letto dal file demo-secret.txt quando si esegue la build docker. L'istruzione RUN con il flag –mount fornisce l'accesso al segreto. Il file viene temporaneamente montato nella directory /run/secrets.

BuildKit ti consente anche di inoltrare l'agente SSH del tuo host in modo che le istruzioni di compilazione possano interagire con le connessioni remote esistenti. Passa il flag –ssh a docker build e aggiungi –mount=type=ssh alle istruzioni RUN nel tuo Dockerfile:

docker build –ssh . ESEGUI –mount=type=ssh git clone git@example.com:/project.git

Queste caratteristiche rendono più conveniente la creazione di immagini senza compromettere la sicurezza generale. L'inoltro dell'agente SSH e i montaggi segreti sono disponibili solo in BuildKit; non esiste una controparte nel motore di compilazione predefinito.

Conclusione

BuildKit è il generatore di immagini Docker di prossima generazione che utilizza un formato binario grafico per drasticamente accelerare le build. Sebbene le prestazioni varino considerevolmente per ogni Dockerfile, puoi aspettarti di vedere notevoli accelerazioni nei casi in cui è possibile l'elaborazione parallela dei livelli di immagine.

L'architettura di BuildKit ottimizza alcune delle più recenti funzionalità di Dockerfile. Le build a più fasi beneficiano del salto delle fasi inutilizzate, il che rende il processo più efficiente rispetto al builder standard.

Anche se BuildKit è ora stabile, Docker non viene ancora fornito con esso per impostazione predefinita. Assicurati di abilitarlo nel tuo client Docker se desideri utilizzare le sue funzionalità. C'è una proposta attiva per rendere BuildKit il motore di compilazione standard, ma ci sono ancora problemi irrisolti che impediscono il passaggio.


Posted

in

by

Tags: