4.1 Le basi del comando docker build
Il comando docker build
è il modo principale per creare un'immagine Docker a partire da un Dockerfile. Prende le istruzioni dal Dockerfile e, passo dopo passo, le esegue formando l'immagine a strati. In questa lezione vedremo come funziona il comando docker build
, quali parametri ha e come usarlo nella pratica.
Il comando docker build
costruisce un'immagine a partire da un Dockerfile e dal cosiddetto contesto di build. Il contesto di build sono i file che Docker utilizza per creare l'immagine. Questo può essere una directory locale sulla tua macchina o, ad esempio, un repository su GitHub.
Sintassi
docker build [OPTIONS] PATH | URL | -
Dove:
-
PATH
: il percorso della directory che contiene il Dockerfile e il contesto di build. URL
: l'indirizzo URL di un repository remoto.-
: lettura del Dockerfile dallo standard input (stdin).
Esempio di utilizzo base
In questo esempio Docker utilizzerà il Dockerfile dalla directory corrente (.)
e creerà un'immagine con il nome myimage
e il tag latest
.
docker build -t myimage:latest .
4.2 Personalizzazione del comando build
Principali parametri del comando docker build
Il comando docker build
supporta un sacco di opzioni che permettono di configurare il processo di build.
1. Parametri -t
, --tag
Il parametro -t
o --tag
viene usato per assegnare un nome e un tag all'immagine creata.
docker build -t myimage:latest .
2. Parametri -f
, --file
Il parametro -f
o --file
permette di specificare un Dockerfile alternativo, se differente dal Dockerfile standard.
docker build -f Dockerfile.dev -t myimage:dev .
3. Parametro --build-arg
Il parametro --build-arg
è usato per passare argomenti di build definiti tramite l'istruzione ARG nel Dockerfile.
docker build --build-arg APP_VERSION=1.0 -t myimage:1.0 .
4. Parametro --no-cache
Il parametro --no-cache
consente di eseguire il build senza utilizzare la cache. È utile per assicurarsi che tutti i comandi vengano eseguiti nuovamente.
docker build --no-cache -t myimage:latest .
5. Parametro --target
Il parametro --target
è usato per specificare lo stage di destinazione in una build multi-stage.
docker build --target builder -t myimage:builder .
6. Parametro --rm
Il parametro --rm
indica a Docker di rimuovere i container intermedi dopo una build dell'immagine riuscita (abilitato di default).
docker build --rm -t myimage:latest .
4.3 Esempi di docker build
Esempio 1: Creazione di base
Supponiamo che tu abbia un'app semplice in Node.js e vuoi creare un'immagine Docker per il suo deployment.
Dockerfile:
FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
Comando per la build:
docker build -t mynodeapp:latest .
In questo esempio, Docker creerà un'immagine mynodeapp
con il tag latest
, usando il Dockerfile dalla directory corrente.
Esempio 2: Build con utilizzo di argomenti
Gli argomenti di build ti permettono di passare variabili al Dockerfile durante la creazione.
Dockerfile
FROM node:14
ARG APP_VERSION
ENV APP_VERSION=${APP_VERSION}
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
Comando per la build:
docker build --build-arg APP_VERSION=1.0 -t mynodeapp:1.0 .
In questo esempio, l'argomento APP_VERSION
viene passato al Dockerfile, permettendo di specificare la versione dell'app durante la build.
Esempio 3: Build multi-stage
La build multi-stage viene usata per creare immagini che includano solo i componenti necessari. Questo permette di ridurre la dimensione dell'immagine finale.
Dockerfile
# Fase di build
FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# Creazione immagine finale con file minimali
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
Comando per la build:
docker build -t mywebapp:latest .
In questo esempio, si crea prima un'immagine intermedia builder, dove avviene la build dell'app. Dopo la build, l'app viene trasferita nell'immagine finale, che usa Nginx per servire il contenuto pronto.
4.4 Consigli pratici
1. Ottimizzazione dell'ordine delle istruzioni
Per un utilizzo efficiente della cache Docker, è importante ordinare correttamente le istruzioni. Ad esempio, copia prima i file che cambiano raramente, come package.json
, per minimizzare la ricompilazione delle dipendenze. Poi esegui la copia degli altri file.
COPY package*.json ./
RUN npm install
COPY . .
2. Uso di .dockerignore
Aggiungi un file .dockerignore
per escludere file e directory non necessari dal contesto di build. Questo ridurrà la dimensione del contesto e accelererà la creazione dell'immagine.
Esempio di .dockerignore
:
node_modules
dist
*.log
3. Build multi-stage
Usa la build multi-stage per creare immagini minimaliste e leggere. Questo approccio permette di includere solo i file e le dipendenze realmente necessari per l'esecuzione dell'applicazione, escludendo i dati superflui dal'immagine finale, come file temporanei o il codice sorgente.
GO TO FULL VERSION