RousselTMLEARNING

Observabilité

Linter ses Dockerfile avec Hadolint et docker build --check

Repérer les erreurs et mauvaises pratiques d'un Dockerfile avant la construction : Hadolint, ses règles, ses seuils, et les vérifications intégrées à BuildKit.

1. Pourquoi linter un Dockerfile ? #

Trouver les problèmes avant de construire.

Le principe #

Un linter lit le Dockerfile sans le construire et signale les erreurs et mauvaises pratiques : image sans version, ADD au lieu de COPY, cache apt conservé, CMD en forme shell. Hadolint est la référence ; il analyse aussi les commandes RUN avec ShellCheck.

Le lint à chaque étape : éditeur, pre-commit, CI, docker build --check

2. Hadolint en pratique #

Un vrai résultat, et comment le lire.

Le Dockerfile à corriger #

FROM node
RUN apt-get update && apt-get install -y curl
ADD . /app
WORKDIR /app
RUN npm install
EXPOSE 3000
CMD npm start
hadolint Dockerfile
# ou sans installation
docker run --rm -i hadolint/hadolint:v2.15.1 < Dockerfile
Dockerfile:1 DL3006 warning: Always tag the version of an image explicitly
Dockerfile:2 DL3008 warning: Pin versions in apt get install. Instead of `apt-get install <package>` use `apt-get install <package>=<version>`
Dockerfile:2 DL3015 info: Avoid additional packages by specifying `--no-install-recommends`
Dockerfile:2 DL3009 info: Delete the apt lists (/var/lib/apt/lists) after installing something
Dockerfile:3 DL3020 error: Use COPY instead of ADD for files and folders
Dockerfile:7 DL3025 warning: Use arguments JSON notation for CMD and ENTRYPOINT arguments
RègleProblèmeCorrection
DL3006Image sans versionnode:22.11-bookworm-slim
DL3020ADD pour des fichiers locauxCOPY
DL3015 / DL3009Paquets recommandés, cache apt conservé--no-install-recommends, rm -rf /var/lib/apt/lists/*
DL3025CMD en forme shell : signaux mal transmisCMD ["npm", "start"]

Le résultat après correction #

Sur le Dockerfile durci de la leçon précédente, Hadolint a encore signalé DL3066 pour USER nonroot : un nom d'utilisateur peut ne pas être résolu par l'hôte. Avec USER 65532:65532, il ne signale plus rien et renvoie le code 0.

Seuils et exceptions #

Par défaut, Hadolint échoue dès le premier constat, même de niveau info. En CI, fixez un seuil, et justifiez chaque exception dans .hadolint.yaml :

hadolint --failure-threshold warning Dockerfile
hadolint -f json Dockerfile   # pour un outil de CI
# .hadolint.yaml
ignored:
  - DL3008   # versions apt gérées par Renovate

Ponctuellement, un commentaire # hadolint ignore=DL3008 juste au-dessus de la ligne.

3. Les vérifications intégrées #

docker build --check.

docker build --check #

BuildKit embarque ses propres règles (casse des mots-clés, FROM … AS incohérent, variables non définies, CMD en forme shell…). La commande les évalue sans construire l'image :

docker build --check .

Elles complètent Hadolint sans le remplacer : Hadolint va plus loin sur les commandes shell et les paquets. Cette commande n'a pas été exécutée pour cet article, faute de démon Docker dans notre environnement de test.

Sources #

Sorties réelles de Hadolint 2.15.1.

Articles liés

Images durcies : réduire la surface d'attaque de ses conteneurs

Choisir une image de base durcie : slim, distroless, Docker Hardened Images, Chainguard ; non-root, versions …

Scanner ses images Docker : Trivy, Grype et Docker Scout

Détecter les vulnérabilités et erreurs de configuration des images avec Trivy, lire les résultats, filtrer ce…

SBOM : l'inventaire des composants de vos images

Générer un SBOM CycloneDX ou SPDX, le rescanner sans reconstruire et savoir en quelques secondes quelles imag…

Pour aller plus loin

Soutenir

♥ SOUTENIR

Soutenez RousselTM Learning

Les formations, articles, TP et attestations restent gratuits et sans publicité intrusive. Une contribution libre, du montant de votre choix, finance l’hébergement, les environnements de TP et l’écriture de nouveaux contenus.

Contribuer avec PayPal Montant libre · carte bancaire ou compte PayPalEn savoir plus
QR code PayPal
Ou scannez ce QR code avec votre téléphone

Merci, chaque contribution compte !