8. Buone pratiche per le immagini Docker personalizzate in produzione
Fissare una versione specifica dell'immagine base (ad esempio node:20.11-alpine, non node:latest) evita che un aggiornamento dell'immagine base da parte del produttore modifichi inaspettatamente il comportamento della tua applicazione dopo un nuovo rebuild del container, spesso senza alcuna notifica chiara della modifica.
La build multi-stage consente di mantenere piccola l'immagine finale di produzione, senza strumenti di build e dipendenze per lo sviluppo. Ciò velocizza il trasferimento dell'immagine verso il registro e dal registro al server di produzione, riducendo anche la superficie d'attacco del container.
Le variabili d'ambiente e i segreti (password, chiavi API) non devono mai essere inseriti direttamente nell'immagine Docker come valori nel Dockerfile, ma devono essere passati al momento dell'avvio del container. Un'immagine costruita con un segreto al suo interno potrebbe infatti finire in un registro ed essere ricostruita da chiunque abbia accesso al registro.
Un healthcheck configurato nell'immagine o in docker-compose permette di rilevare automaticamente che il container è in esecuzione, ma l'applicazione al suo interno ha smesso di rispondere, ad esempio perché un processo è bloccato. Senza healthcheck, la condizione potrebbe passare inosservata, perché il container sarebbe ancora ufficialmente attivo.
Conviene indirizzare i log del container allo standard output (stdout/stderr), non a file interni al container. I log scritti nei file scompaiono con l'eliminazione del container, mentre quelli dello standard output si raccolgono e consultano più facilmente con gli strumenti standard di Docker.
Controllare regolarmente quali immagini e tag del registro privato sono ancora in uso aiuta a mantenere l'ordine e a liberare spazio disco occupato da vecchie versioni ormai inutili, accumulate dopo deploy ripetuti tramite CI/CD.