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.
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 starthadolint Dockerfile
# ou sans installation
docker run --rm -i hadolint/hadolint:v2.15.1 < DockerfileDockerfile: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ègle | Problème | Correction |
|---|---|---|
| DL3006 | Image sans version | node:22.11-bookworm-slim |
| DL3020 | ADD pour des fichiers locaux | COPY |
| DL3015 / DL3009 | Paquets recommandés, cache apt conservé | --no-install-recommends, rm -rf /var/lib/apt/lists/* |
| DL3025 | CMD en forme shell : signaux mal transmis | CMD ["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 RenovatePonctuellement, 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.
