notes/cache-from-fige-les-correctifs
Ton image vient d'être reconstruite, et son apt upgrade n'a pas tourné
Avec --cache-from, la couche de mise à jour des paquets ressort du cache tant que le Dockerfile ne bouge pas. Le scanner refuse une image qui sort du four.
- docker
- ci
- sécurité
#9 [ 3/13] RUN apt-get update && apt-get upgrade -y --no-install-recommends && ...
#9 CACHED
Deux lignes dans la trace d'un build du 16 septembre 2026, sur le worker de RecyNetwork. L'image venait d'être reconstruite, Trivy l'a refusée sur deux failles HIGH de libpcre2-8-0, CVE-2026-86145 et CVE-2026-89161, alors que le correctif 10.46-1~deb13u2 était publié et que le Dockerfile fait bien son apt-get upgrade.
Il le fait dans le texte. À l'exécution, le job construit avec --cache-from registry/worker:latest, pour ne pas retélécharger 300 Mo de Chromium à chaque commit. Docker reprend une couche du cache tant que deux choses n'ont pas changé : la ligne du Dockerfile et l'empreinte de l'image de base. L'index des paquets Debian bouge tous les jours sans toucher ni à l'une ni à l'autre. La couche upgrade ressort donc telle qu'elle était le jour où elle a tourné pour la dernière fois.
J'ai vérifié que l'upgrade aurait suffi, dans l'image de base nue :
docker run --rm <base> bash -c "dpkg -l libpcre2-8-0 | tail -1; \
apt-get update -qq >/dev/null 2>&1; apt-get upgrade -y -qq >/dev/null 2>&1; \
dpkg -l libpcre2-8-0 | tail -1"
10.46-1~deb13u1 avant, 10.46-1~deb13u2 après.
Un ticket du même dépôt proposait un rebuild périodique pour absorber ce genre de correctif. Il n'aurait rien absorbé : un rebuild qui relit le cache rejoue la vieille couche.
La parade est une couche de mise à jour à part, dont la clé de cache porte la date :
ARG APT_SECURITY_DATE=unset
RUN apt-get update && apt-get upgrade -y --no-install-recommends && \
apt-get clean && rm -rf /var/lib/apt/lists/*
docker build --build-arg APT_SECURITY_DATE="$(date -u +%Y-%m-%d)" ...
Sa place compte. Invalider une couche invalide toutes celles qui suivent. Posée en tête, elle ferait retélécharger Chromium tous les matins et le --cache-from ne servirait plus à rien. Elle va après la couche lourde : une petite couche de paquets système refaite une fois par jour.
Pour savoir si ta montée a tourné, tu ouvres la trace du build et tu cherches CACHED sur la ligne de l'upgrade. docker history te donne la même réponse par la date de création de chaque couche.