Aller au contenu principal
~$ guillaume.putier.fr

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.

retour aux notes