Creare un'immagine
Breve manuale sulla creazione di un'immagine
In questo breve manuale vedremo i passaggi per ottenere un'immagine di docker con all'interno il necessario per far partire un server in nodejs e una versione JRE di Java per eventualmente buildare delle API. Il container esporrà la porta 9876.
Setup del progetto
Crea una cartella con un nome a tua scelta e crea all'interno un file chiamato Dockerfile senza estensione
Mantieni la maiuscola iniziale del nome del file poiché di default docker
cerca un file chiamato Dockerfile in fase di build e in alcuni casi potrebbe
dare problemi
Scelta dell'immagine di partenza
Una volta creato il file Dockerfile bisogna scegliere l'immagine di partenza per la nostra nuova immagine utilizzando il comando FROM di docker.
Il comando
FROMserve a indicare un'immagine di partenza per la nuova build [leggi di più (opens in a new tab)]
Nel nostro caso utilizzeremo l'immagine node:14-alpine che è un'immagine basata su linux alpine (opens in a new tab) con nodejs installato
I dettagli dell'immagine e le varie versioni sono disponibili su questa pagina (opens in a new tab) nella quale è possibile anche cercare i vari tag disponibili per l'immagine
All'interno della card contenente i dati dell'immagine sono presenti anche i processori e le architetture supportate.

Potrebbe succedere che l'immagine in fase di build dia un errore perché non riesce a riconoscere il tipo di os/arch quindi potrebbe succedere di doverglielo specificare
La ragione per cui utilizziamo questa immagine di partenze è perché scegliere una versione specifica di NodeJs da installare è abbastanza tricky su linux alpine. Dunque partiremo proprio da una versione preconfigurata in modo da evitarci qualche fastidio
il nostro Dockerfile dovrebbe quindi avere questo aspetto:
FROM node:14-alpineInstallazione di Java
Per installare Java su linux alpine dobbiamo utilizzare il package manager apk che è il package manager di default per linux alpine (quello che per altre distro di linux è apt o yum)
Per installare un pacchetto con apk basta utilizzare il comando apk add <nome pacchetto> [leggi di più (opens in a new tab)]
Per installare Java su linux alpine dobbiamo utilizzare il pacchetto openjdk17-jre che è la versione JRE di Java 11 utilizzando il comando RUN di docker
Il comando
RUNserve a eseguire un comando all'interno dell'immagine [leggi di più (opens in a new tab)]
Prima di installare un pacchetto assicurati che sia disponibile su nel repo
di alpine (opens in a new tab) nel quale potrai cercare sia
il nome esatto del pacchetto sia utilizzare delle wildcard per cercare
pacchetti con nomi simili Ad esempio, per cercare tutte le versioni di openjdk
si può utilizzare il criterio di ricerca openjdk*
Il nostro Dockerfile dovrebbe quindi avere questo aspetto:
FROM node:14-alpine
RUN apk add openjdk17-jreEsporre la porta
Per esporre la porta del nostro server dobbiamo utilizzare il comando EXPOSE di docker
Il comando
EXPOSEserve a esporre una porta all'esterno dell'immagine [leggi di più (opens in a new tab)]
Es: Per esporre la porta 3000 dobbiamo utilizzare il comando EXPOSE 3000
Il nostro Dockerfile dovrebbe quindi avere questo aspetto:
FROM node:14-alpine
RUN apk add openjdk17-jre
EXPOSE 9876Il passaggio appena visto è l'ultimo necessario per creare un'immagine di Docker. Nel caso il tuo interesse sia solo quello di creare un'immagine di Docker puoi saltare a questa sezione
Copiare i file
Per essere più comodi nello svolgimento dei prossimi passaggi copieremo i file del nostro progetto all'interno della cartella root dell'immagine utilizzando il comando COPY di docker
Copieremo tutti i file del progetto all'interno della cartella principale dell'immagine
Il comando
COPYserve a copiare file all'interno dell'immagine [leggi di più (opens in a new tab)]
Es: Per copiare il file index.js nella cartella /app dobbiamo utilizzare
il comando COPY index.js /app
Una volta che i file sono stati copiati ci sposteremo all'interno della cartella principale dell'immagine in modo da poter concludere il setup e avviare il progetto
Il nostro Dockerfile dovrebbe quindi avere questo aspetto:
FROM node:14-alpine
RUN apk add openjdk17-jre
EXPOSE 9876
COPY . .
a questo punto saremo pronti per eseguire i soliti comandi di routine per far partire il progetto
Installazione delle dipendenze
Per installare le dipendenze dobbiamo utilizzare il comando RUN di docker visto in precedenza tramite il cui eseguiremo il comando npm install
Il nostro Dockerfile dovrebbe quindi avere questo aspetto:
FROM node:14-alpine
RUN apk add openjdk17-jre
EXPOSE 9876
COPY . .
RUN npm install --production
Avvio del progetto
Ora non ci resterà che avviare il progetto tramite il comando CMD di docker invocando lo script di node designato per l'avvio del progetto, nel nostro caso: npm start
Il comando
CMDserve a eseguire un comando all'avvio dell'immagine [leggi di più (opens in a new tab)]
Il nostro Dockerfile dovrebbe quindi avere questo aspetto:
FROM node:14-alpine
RUN apk add openjdk17-jre
EXPOSE 9876
COPY . .
RUN npm install --production
CMD ["npm", "start"]Perché in questo caso utilizziamo CMD invece di RUN?
Perché CMD viene eseguito senza invocare una shell effettiva, quindi tutti i lavori di parsing evnetuali delle variabili d'ambiente intere al sistema (come ad esempio il parsing della variabile d'ambiente $HOME) vengono saltati e l'avvio risulta più veloce
Ignorare i file
Per ignorare i file che non sono necessari per l'avvio del progetto dobbiamo utilizzare il comando .dockerignore di docker
Il file funziona esattamente come un .gitignore e serve a ignorare i file che non sono necessari per l'avvio del progetto
Il nostro .dockerignore dovrebbe quindi avere questo aspetto:
node_modulesdato che i node_modules non ci servono per l'avvio del progetto data la loro rigenerazione ad ogni avvio