Quand vous utilisez une image pour lancer votre container, celle-ci utilise généralement une image parente. Par exemple, l'image Traefik va utiliser l'image suivante comme base :

FROM alpine:3.11

Comment j'obtiens cette information ?

En regardant le fichier Dockerfile de Traefik :

  • https://github.com/containous/traefik-library-image/blob/296caddf8ba97b52841872b2192758af9e9d7775/alpine/Dockerfile

Cette image alpine, à la base de mon image Traefik, subit donc quelques ajouts, afin de devenir une nouvelle image. Je pourrais également à mon tour me servir de cette nouvelle image comme base !

Si j'utilise Traefik comme image de base, qui lui-même utilise une image alpine comme base....dans ce cas, qu'utilise l'image alpine comme base ?!

FROM scratch

Bien évidemment cette réponse se trouve également dans le fichier Dockerfile de l'image ! En récupérant celui-ci sur le Github du projet, on obtient rapidement la réponse :

FROM scratch

Mais qu'est-ce qui se cache derrière cette image scratch !?

Essayons de lancer quelques commandes avec l'image : scratch.

Je vais commencer par un run de l'image en question :

docker run -it --rm scratch sh

J'obtiens très rapidement une erreur :

Unable to find image 'scratch:latest' locally
docker: Error response from daemon: 'scratch' is a reserved name.

Essayons donc de pull l'image :

docker pull scratch

De nouveau une erreur :

Using default tag: latest
Error response from daemon: 'scratch' is a reserved name

L'information renvoyée nous indique que ce nom est réservé.

En réalité, scratch n'est pas une image comme les autres ! C'est une image virtuelle qui est complètement vide !

Depuis Docker 1.5.0, la commande FROM scratch présente au début d'un fichier Dockerfile ne créera pas de couche supplémentaire dans notre image.

La commande va signaler au processus de construction que nous voulons que la prochaine commande du Dockerfile soit la première couche du système de fichier de notre image.

Elle nous permet de construire des images de base, et pas uniquement des images "systèmes d'exploitation" :

Jérôme Petazzoni avait réalisé une très belle série d'articles en ce début d'année sur la taille des images et comment la minimiser.

Au cours de cette série, vous pourrez retrouver un exemple d'utilisation de l'image scratch mais aussi les avantages et les inconvénients de son utilisation !

Pour résumer brièvement, voici quelques inconvénients :

  • C'est minimaliste...
  • Très minimaliste !
  • Pas de shell,
  • Pas d'outil de debug ( ps, ls, ping, etc ),
  • Pas de librairie dynamique...

Mais elle offre certains avantages :

  • Surface d'attaque réduite car seul ce qui est vraiment nécessaire pour exécuter votre application est dans l'image,
  • Pull et temps de démarrage minime,
  • Taille de l'image.

Dans certains cas, comme par exemple pour les appareils IoT, l'image scratch peut-être très utile.

Enfin, c'est votre besoin  qui pourra vous permettre de répondre à la question suivante : Dois-je utiliser la version scratch, alpine ou même d'un autre OS de mon image ?


Vous en savez maintenant un peu plus sur un des mécanismes des images de Docker !

Vous aurez maintenant le choix entre construire vos propres images en utilisant une coquille vide ( scratch) ou utiliser une autre base avec des outils pré-installés !

Et même lors du choix de votre image favorite, vous pourrez maintenant regarder si elle possède une version minimaliste : Par exemple Traefik ! 😍

Dans mon cas je réalise ce choix en fonction des images et des situations. Par exemple pour Traefik il m'arrive d'utiliser la version scratch puisque j'ai peu de debug à faire sur ce container ( et pour les rares cas problématiques : mode debug de Traefik + dashboard ).

Je ne vous ai pas montré comment utiliser cette image pour construire votre propre image minimaliste car les liens qui suivent en regorge :

Liens utiles :

  • https://enix.io/fr/blog/cherie-j-ai-retreci-docker-part1/
  • https://codeburst.io/docker-from-scratch-2a84552470c8
  • https://docs.docker.com/develop/develop-images/baseimages/
  • https://www.mgasch.com/post/scratch/
  • https://ericchiang.github.io/post/containers-from-scratch/

N'hésitez pas à permettre au blog de continuer à exister et à fournir un contenu de qualité - enfin je l'espère - au travers de vos dons sur : buymeacoff.ee/lfache
Et n'hésitez pas à m'apporter des remarques ou des commentaires sur Twitter, ou ici 👇