I Dockerfile definiscono il contenuto delle immagini Docker come un insieme di istruzioni in un file di testo. La sintassi di Dockerfile è generalmente semplice, ma ci sono alcuni trucchi da evitare. Aderire alle migliori pratiche durante la scrittura di Dockerfile complessi in un'impostazione di gruppo può essere complicato a meno che tu non convalidi automaticamente il contenuto del tuo file.
Hadolint è un linter Dockerfile che può individuare problemi comuni per te. Utilizza un albero di sintassi astratto (AST) per analizzare il Dockerfile rispetto a set di regole predefiniti. Hadolint incorpora anche ShellCheck in modo da poter eseguire lint degli script della shell nel RUN
del tuo Dockerfile anche le istruzioni.
Per iniziare
Hadolint è distribuito in più formati. Puoi iniziare rapidamente scaricando l'ultimo binario precompilato per il tuo sistema operativo dalla pagina delle versioni di GitHub del progetto.
Hadolint ha anche una propria immagine Docker, hadolint/hadolint
, se preferisci non utilizzare direttamente il file binario. Come opzione finale, puoi accedere a Hadolint via web per la sperimentazione.
Linguaggio di un Dockerfile
Passa a Hadolint il percorso di un Dockerfile per avviare una nuova scansione:
hadolint Dockerfile
Se stai utilizzando la versione Dockerizzata, è più semplice reindirizzare il contenuto del tuo file in un contenitore Hadolint:
docker run --rm -i hadolint/hadolint < Dockerfile
I risultati della scansione verranno mostrati nel tuo terminale. In questo esempio, Hadolint suggerisce che RUN apt-get install
del Dockerfile istruzione non è sicura in quanto non specifica le versioni esplicite del pacchetto. Il contenuto della tua immagine potrebbe cambiare tra le build, creando potenzialmente problemi di confusione.
Cosa cerca Hadolint?
Hadolint ha dozzine di regole integrate che controllano la configurazione e i problemi di sicurezza comuni. Linter mira a rendere i tuoi Dockerfile conformi alle migliori pratiche di creazione di immagini suggerite da Docker.
I controlli inclusi coprono l'uso di utenti finali non root, facendo riferimento a un percorso relativo in un WORKDIR
istruzione, aggiungendo più HEALTHCHECK
istruzioni e non utilizzando tag e versioni fissati in modo esplicito. Poiché Hadolint eredita anche il set di regole ShellCheck, verranno alla luce i comuni problemi di scripting di Bash che lo strumento identifica anche.
Le regole sono identificate come numeri preceduti da HL
o SC
. HL
le regole fanno parte di Hadolint mentre SC
le voci provengono da ShellCheck. A ogni controllo viene assegnata una gravità da Error a Info. Se ricevi Errori nei risultati della scansione, questi dovrebbero essere i primi problemi che risolvi.
Personalizzazione della configurazione
Hadolint è configurato tramite un .hadolint.yaml
file. Cercherà in più posizioni incluso il tuo lavoro, .config
e directory home. Viene utilizzato solo il primo file trovato:non è possibile unire le posizioni.
Il file di configurazione consente di personalizzare le scansioni ignorando le regole e modificandone la gravità. Sebbene il set di regole predefinito copra le best practice consigliate, potresti scoprire che alcuni controlli non si applicano al tuo ambiente. Commettere un .hadolint.yaml
insieme al tuo Dockerfile ti consente di personalizzare le scansioni Hadolint di conseguenza. La maggior parte dei campi dei file di configurazione sono supportati anche come flag CLI e variabili di ambiente.
Le regole sono disabilitate dal ignored
campo. Questo dovrebbe essere un elenco di ID regola:
ignored: - DL3010 - DL3020
Se devi ridurre la gravità di una regola senza disabilitarla del tutto, utilizza il override
chiave invece. Ciò ti consente anche di promuovere un problema di bassa gravità a un livello superiore. Usalo se vuoi porre maggiore enfasi su un particolare problema.
override: warning: - DL3020
Questo retrocede la regola DL3020 dal suo livello di "errore" predefinito al meno grave "avviso". Questa regola richiede l'utilizzo di COPY
invece di ADD
quando fai riferimento a file e cartelle nel tuo contesto di build.
Puoi anche regolare il livello di gravità globale. Impostazione della failure-threshold
il campo indica a Hadolint di uscire con uno stato di errore se un test segnala un errore al livello di gravità specificato:
failure-threshold: warning
Questa istruzione significa che la scansione Hadolint fallirà se c'è un errore o un avviso nel suo output.
Puoi disabilitare l'uscita con un codice di errore usando il no-fail: true
config o il --no-fail
Bandiera CLI. Questo indicherà a Hadolint di uscire con un 0
codice indipendentemente dall'esito effettivo del test. Può essere utile se desideri includere Hadolint come processo non bloccante in una pipeline CI.
Registri di fiducia
Un altro uso del file di configurazione è definire registri attendibili a cui si desidera poter fare riferimento nei propri Dockerfile. Quando il trustedRegistries
campo è impostato, Hadolint ti avviserà quando viene utilizzata un'immagine da un altro registro:
trustedRegistries: - docker.io - docker-registry.example.com
Schemi di etichette
Hadolint offre anche pelucchi di base per etichette. Ciò ti consente di applicare le etichette aggiunte alla tua immagine da Dockerfile LABEL
le istruzioni rispettano i vincoli specificati. Ecco un esempio di come funziona:
label-schema: notes: text app-version: semver built-at: rfc3339
Questo frammento di configurazione definisce i tipi di dati per quattro etichette che puoi utilizzare nel tuo Dockerfile. notes
viene dichiarato come campo di testo arbitrario mentre app-version
deve essere un identificatore di versione compatibile con semver. built-at
è contrassegnato come stringa datetime RFC-3339. Puoi ottenere l'elenco completo dei tipi supportati nei documenti Hadolint.
Hadolint consente l'uso di etichette che non sono elencate nello schema. Puoi disabilitarlo e limitare LABEL
istruzioni solo a quelli presenti nello schema impostando strict-labels: true
o usando il --strict-labels
bandiera.
Formati di output
Diversi formati di output sono supportati tramite il format
opzione o --format
bandiera. L'impostazione predefinita è tty
che emette un output colorato sul tuo terminale. I colori possono essere disabilitati con il --no-color
bandiera.
Sono disponibili i seguenti formattatori alternativi:
json
– Fornisce l'elenco dei problemi rilevati come una struttura JSON dettagliata, ideale per l'uso con i propri script.checkstyle
– Un report compatibile con Checkstyle.codeclimate
– Un rapporto compatibile con il clima del codice.gitlab_codeclimate
– Variazione del report Code Climate che funziona con le funzionalità integrate di qualità del codice di GitLab. Ciò ti consente di visualizzare gli errori come widget nelle pagine di richiesta di unione durante l'esecuzione di Hadolint con GitLab CI.
Questi formati di output sono ideali per l'utilizzo di Hadolint a livello di codice o come parte di una pipeline CI.
Riepilogo
Hadolint automatizza il rilevamento dei problemi di Dockerfile. Ciò consente alle tue immagini Docker di aderire alle best practice e agli standard organizzativi. La configurazione predefinita è un buon punto di partenza, ma puoi personalizzarla in base alle tue esigenze riclassificando e disabilitando le regole.
Dovresti considerare l'integrazione di Hadolint con il tuo strumento CI per ottenere rapporti immediati quando le modifiche Dockerfile vengono salvate. Ciò accelera la revisione del codice offrendo agli sviluppatori visibilità immediata sui problemi. Puoi anche utilizzare lo strumento in locale mentre lavori tramite le estensioni dell'editor supportate dalla community, fornendo un ciclo di feedback ancora più breve.