3.1 Istruzione FROM
Allora, ti ricordo, il Dockerfile è un file di testo che contiene istruzioni per creare un'immagine Docker. Ogni istruzione in un Dockerfile esegue un compito specifico e crea un nuovo layer nell'immagine. In questa lezione ci concentreremo sulle principali istruzioni Dockerfile: FROM
, RUN
, COPY
e CMD
, che sono fondamentali per creare immagini Docker funzionali ed efficienti.
L'istruzione FROM
definisce l'immagine di base da cui verrà creata la nuova immagine. È la prima istruzione in ogni Dockerfile e stabilisce il punto di partenza per la costruzione dell'immagine.
Sintassi
FROM <image>[:<tag>] [AS <name>]
Dove:
<image>
: il nome dell'immagine di base.<tag>
: (opzionale) la versione dell'immagine di base. Di default viene utilizzatolatest
.AS <name>
: (opzionale) assegnazione di un nome per questa fase di build (utilizzato nella build multi-stage).
Esempi
Utilizzo dell'immagine di base Ubuntu
:
FROM ubuntu:20.04
Utilizzo dell'immagine ufficiale Node.js
:
FROM node:14
Utilizzo della build multi-stage per ottimizzare:
FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
In questo esempio si utilizzano due immagini di base. La prima (node:14) viene utilizzata per costruire l'applicazione, la seconda (nginx:alpine) — per creare un server leggero che servirà i file statici.
Grazie all'utilizzo della build multi-stage, l'immagine finale contiene solo il set minimo di file e programmi (in questo caso Nginx
e i file statici costruiti), rendendola più leggera e veloce per il deployment.
3.2 Istruzione RUN
L'istruzione RUN
esegue comandi all'interno del container e crea un nuovo layer nell'immagine. Questa istruzione viene utilizzata per installare pacchetti, configurare l'ambiente ed eseguire altri comandi necessari per preparare l'immagine.
Sintassi:
RUN <command>
Dove:
<command>
: comando che verrà eseguito all'interno del container.
Esempi:
Installazione di pacchetti in un'immagine Ubuntu:
RUN apt-get update && apt-get install -y curl git
Compilazione del codice:
RUN gcc -o myapp myapp.c
Unione di più comandi
Per ridurre il numero di layer, diminuire la dimensione dell'image
e accelerare il build, è consigliato unire più comandi in una singola istruzione RUN
.
RUN apt-get update \
&& apt-get install -y curl git \
&& rm -rf /var/lib/apt/lists/*
3.3 Istruzione COPY
L'istruzione COPY
copia i file e le directory dal contesto di build al file system del container. È utile per trasferire il codice sorgente, i file di configurazione e altre risorse nel container.
Sintassi:
COPY <src> <dest>
Dove:
-
<src>
: percorso dei file o delle directory nel contesto di build. <dest>
: percorso di destinazione nel container.
Esempi:
Copia di tutto il contenuto della directory corrente nella directory di lavoro del container:
COPY . /app
Copia di singoli file:
COPY package.json /app/package.json
COPY server.js /app/server.js
Uso del .dockerignore
Per escludere i file non necessari dal processo di copia si può usare il file .dockerignore
, che funziona in modo simile a .gitignore
.
node_modules
dist
*.log
3.4 Istruzione CMD
L'istruzione CMD
specifica il comando che verrà eseguito quando il container viene avviato. A differenza di RUN
, che si esegue nella fase di build, CMD
viene eseguita al momento dell'avvio del container dall'immagine creata.
Sintassi:
CMD ["executable","param1","param2"]
Oppure
CMD command param1 param2
Dove:
- ["executable","param1","param2"]: forma exec, che è preferibile per garantire una corretta gestione dei segnali.
- command param1 param2: forma
shell
, che esegue il comando in una shell.
Esempi:
Esecuzione di un'applicazione Node.js
:
CMD ["node", "app.js"]
Esecuzione di uno script shell
:
CMD /usr/bin/myscript.sh
La differenza tra CMD
e ENTRYPOINT
CMD
definisce un comando di default che può essere sovrascritto durante l'avvio del container. ENTRYPOINT
specifica un comando immutabile che verrà sempre eseguito all'avvio del container.
Esempio di utilizzo di ENTRYPOINT
:
ENTRYPOINT ["python", "script.py"]
CMD ["arg1"]
In questo esempio, ENTRYPOINT
esegue uno script Python, mentre CMD
passa gli argomenti che possono essere modificati durante l'avvio del container.
Esempio di Dockerfile con istruzioni principali
# Utilizziamo un'immagine base di Node.js
FROM node:14
# Impostiamo la directory di lavoro
WORKDIR /app
# Copiamo i file package.json e package-lock.json
COPY package*.json ./
# Installiamo le dipendenze
RUN npm install
# Copiamo il codice sorgente dell'applicazione
COPY . .
# Indichiamo la porta che l'app utilizzerà
EXPOSE 3000
# Definiamo il comando per avviare l'applicazione
CMD ["node", "app.js"]
GO TO FULL VERSION