🎉 Il Necronomicon è stato aggiornato alla versione 2.0.0 🎉
Docker
Creare un'immagine

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 FROM serve 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.

tag arch

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-alpine

Installazione 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 RUN serve 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-jre

Esporre la porta

Per esporre la porta del nostro server dobbiamo utilizzare il comando EXPOSE di docker

Il comando EXPOSE serve 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 9876
ℹ️

Il 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 COPY serve 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 CMD serve 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_modules

dato che i node_modules non ci servono per l'avvio del progetto data la loro rigenerazione ad ogni avvio