Come creare le tue immagini di base Docker da “Scratch”

0
171

Le immagini Docker vengono create da un Dockerfile che definisce un'immagine di base e una serie di istruzioni che aggiungono i propri livelli di filesystem. Cosa succede se vuoi creare la tua “immagine di base” anche se? Ecco come iniziare da zero e creare un filesystem contenitore completo da zero.

Cos'è un'immagine?

< p>Le immagini Docker generalmente utilizzano una popolare distribuzione Linux come immagine di base. Se hai scritto FROM ubuntu:latest, FROM debian:latest o FROM alpine:latest, hai usato un sistema operativo come base. Potresti anche utilizzare un'immagine preconfigurata per un particolare linguaggio di programmazione o framework, come FROM php:8.0 o FROM node:16.

Tutte queste immagini forniscono un utile punto di partenza per le vostre applicazioni. Vengono forniti con le comuni utilità Unix e i pacchetti software chiave. Tuttavia, tutto ciò aumenta le dimensioni dell'immagine finale. Un'immagine veramente minimale dovrebbe essere costruita costruendo il tuo filesystem dai primi principi.

Il “scratch” Immagine

Docker fornisce un'immagine di base speciale che indica che vuoi controllare il primo livello del filesystem. Questo è il livello più basso della tua immagine, solitamente definito dall'immagine di base indicata dalla tua istruzione FROM.

Quando vuoi creare un'immagine “da zero,” scrivere DA zero nel tuo Dockerfile è il modo per farlo! Questo ti dà un filesystem che’una tabula rasa per cominciare.

FROM zero Advertisement

Dovresti quindi usare il resto del tuo Dockerfile come al solito per popolare il filesystem del contenitore con i binari e le librerie di cui hai bisogno.

Che cos'è “scratch”?

Il graffio “immagine” sembra una normale immagine Docker. È anche elencato in Docker Hub. scratch non è in realtà un'immagine, anche se – è una parola chiave riservata che denota il livello di filesystem più basso di un'immagine funzionante. Tutte le immagini Docker si trovano in cima a zero come base comune.

Non è possibile eseguire il pull scratch di Docker e non è possibile eseguire contenitori utilizzandolo. Rappresenta un livello di immagine vuoto, quindi non c'è nulla da eseguire per Docker. Le immagini non possono essere contrassegnate come scratch a causa della loro natura riservata.

Cosa si può aggiungere alle immagini scratch-based?< /h2>

Non hai bisogno di molto per costruire un'immagine funzionante su zero. Tutto quello che devi aggiungere è un binario Linux compilato staticamente che puoi usare come comando della tua immagine.

Ecco una demo funzionante che esegue un piccolo “ciao mondo&#8221 ; programma compilato da C:

#include <stdio.h>   int principale() { printf("Hello World"); restituisce 0; }

Compila il tuo codice C in un binario:

gcc -o helloworld hello.c

Esegui il tuo binario e osserva che “hello world” viene stampato sul tuo terminale:

./helloworld Advertisement

Ora puoi creare un container Docker basato su scratch che esegua il tuo binario:

FROM scratch COPY helloworld/CMD [“helloworld”]

Crea la tua immagine:

docker build -t ciao:latest .

Ispezionare l'immagine con la finestra mobile inspect mostrerà che ha un singolo livello. Il filesystem di questa immagine contiene un solo file, il binario helloworld.

Ora esegui un contenitore usando la tua immagine:

docker esegui hello:latest

Vedrai “ciao mondo” nel tuo terminale mentre il tuo binario compilato viene eseguito. La tua immagine basata su scratch contiene esclusivamente il tuo binario, quindi avrà una dimensione di pochi KB. L'utilizzo di qualsiasi immagine di base del sistema operativo lo aumenterebbe a più megabyte, anche con una distribuzione minima come Alpine.

Praticamente tutte le immagini avranno alcune dipendenze al di là di un semplice binario statico. Dovrai aggiungerli alla tua immagine come parte del tuo Dockerfile. Ricorda che nessuno degli strumenti che dai per scontato nelle distribuzioni Linux standard sarà disponibile finché non li aggiungi manualmente al filesystem dell'immagine.

Quando usare Scratch?

La decisione di iniziare da zero dovrebbe basarsi sulle dipendenze dell'applicazione e sui tuoi obiettivi in ​​merito alla portabilità delle immagini. Le immagini create da zero sono più adatte per ospitare binari compilati staticamente in cui le dimensioni dell'immagine e i tempi di compilazione contano.

scratch ti fornisce una lavagna pulita su cui lavorare, quindi richiede un investimento iniziale per scrivere correttamente il tuo Dockerfile e mantenerlo nel tempo. Alcuni comandi Docker come attach non funzioneranno per impostazione predefinita poiché non ci sarà alcuna shell all'interno del tuo contenitore a meno che non ne aggiungi una.

Pubblicità

L'utilizzo di scratch potrebbe essere più problematico di quanto non valga la pena quando si utilizzano linguaggi interpretati con forti dipendenze ambientali. Dovrai aggiornare continuamente l'immagine di base per fare riferimento alle versioni più recenti di quei pacchetti. Di solito è più conveniente e gestibile utilizzare un sapore minimo di un'immagine di base Docker Hub esistente.

Riepilogo

FROM zero in un Dockerfile indica che vuoi iniziare da un filesystem vuoto in cui hai il controllo di ogni livello che viene aggiunto. Facilita immagini altamente snelle eliminate da tutto tranne le dipendenze di cui la tua applicazione ha bisogno.

È improbabile che la maggior parte degli sviluppatori utilizzi scratch direttamente poiché non è adatto per la maggior parte dei casi d'uso dei contenitori. Potresti scegliere di usarlo se vuoi containerizzare binari statici autonomi con pochi requisiti ambientali.

scratch funziona anche come un chiaro indicatore della differenza tra “contenitori” e VM. Un'immagine contenente un solo file eseguibile è un contenitore Docker utilizzabile poiché il processo viene eseguito sul kernel dell'host. Una normale VM deve essere avviata indipendentemente dal suo host, quindi deve includere un kernel completo del sistema operativo all'interno della sua immagine.