Comment créer vos propres images de base Docker à partir de “Scratch”

0
278

Les images Docker sont créées à partir d'un Dockerfile qui définit une image de base et une série d'instructions qui ajoutent votre propre système de fichiers couches. Que se passe-t-il si vous souhaitez créer votre propre “image de base” bien que? Voici comment repartir de zéro et créer un système de fichiers conteneur complet à partir de zéro.

Qu'est-ce qu'une image ?

< p>Les images Docker utilisent généralement une distribution Linux populaire comme image de base. Si vous avez écrit FROM ubuntu:latest, FROM debian:latest ou FROM alpine:latest, vous avez utilisé un système d'exploitation comme base. Vous pouvez également utiliser une image préconfigurée pour un langage ou un framework de programmation particulier, tel que FROM php:8.0 ou FROM node:16.

Toutes ces images constituent un point de départ utile pour vos applications. Ils sont livrés avec des utilitaires Unix communs et des progiciels clés. Tout cela augmente cependant la taille de votre image finale. Une image vraiment minimale doit être construite en construisant votre propre système de fichiers à partir des premiers principes.

Le “scratch” Image

Docker fournit une image de base spéciale qui indique que vous souhaitez contrôler la première couche du système de fichiers. Il s'agit de la couche la plus basse de votre image, généralement définie par l'image de base indiquée par votre instruction FROM.

Lorsque vous souhaitez créer une image “à partir de zéro,” écrire à partir de zéro dans votre Dockerfile est la solution ! Cela vous donne un système de fichiers qui est une ardoise vierge pour commencer.

FROM scratch Publicité

Vous devez ensuite utiliser le reste de votre Dockerfile comme d'habitude pour remplir le système de fichiers du conteneur avec les binaires et bibliothèques dont vous avez besoin.

Qu'est-ce que “scratch”?

Le scratch “image” ressemble et se sent comme une image Docker normale. Il est même répertorié dans Docker Hub. scratch n'est pas réellement une image cependant – c'est un mot-clé réservé qui désigne la couche de système de fichiers la plus basse d'une image fonctionnelle. Toutes les images Docker reposent sur scratch comme base commune.

Vous ne pouvez pas utiliser Docker scratch et il n'est pas possible d'exécuter des conteneurs en l'utilisant. Il représente un calque d'image vide, il n'y a donc rien à exécuter pour Docker. Les images ne peuvent pas non plus être marquées comme scratch en raison de leur nature réservée.

Que peut-on ajouter aux images scratch ?< /h2>

Vous n'avez pas besoin de grand-chose pour créer une image fonctionnelle à partir de zéro. Tout ce que vous devez ajouter est un binaire Linux compilé statiquement que vous pouvez utiliser comme commande de votre image.

Voici une démo fonctionnelle qui exécute un petit “hello world&#8221 ; programme compilé à partir de C :

#include <stdio.h>   int principal() { printf("Bonjour tout le monde"); renvoie 0 ; }

Compilez votre code C en un binaire :

gcc -o helloworld hello.c

Exécutez votre binaire et observez que “hello world” s'imprime sur votre terminal :

./helloworld Advertisement

Vous pouvez maintenant créer un conteneur Docker basé sur scratch qui exécute votre binaire :

FROM scratch COPY helloworld/CMD [“helloworld”]

Créez votre image :

docker build -t hello:latest .

Inspecter l'image avec docker inspect montrera qu'elle a une seule couche. Le système de fichiers de cette image ne contient qu'un seul fichier, le binaire helloworld.

Exécutez maintenant un conteneur en utilisant votre image :

docker run hello:latest

Vous verrez “bonjour tout le monde” dans votre terminal lorsque votre binaire compilé est exécuté. Votre image à base de scratch contient uniquement votre binaire, sa taille ne sera donc que de quelques Ko. L'utilisation de n'importe quelle image de base du système d'exploitation augmenterait cela à plusieurs mégaoctets, même avec une distribution minimale comme Alpine.

Pratiquement toutes les images auront des dépendances au-delà d'un simple binaire statique. Vous devrez les ajouter à votre image dans le cadre de votre Dockerfile. N'oubliez pas qu'aucun des outils que vous considérez comme acquis dans les distributions Linux standard ne sera disponible tant que vous ne les ajouterez pas manuellement au système de fichiers de l'image.

Quand utiliser Scratch ?

La décision de repartir de zéro doit être basée sur les dépendances de votre application et vos objectifs en matière de portabilité des images. Les images créées à partir de zéro sont les plus adaptées à l'hébergement de fichiers binaires compilés statiquement où la taille de l'image et les temps de génération sont importants.

scratch vous offre une table rase sur laquelle travailler, ce qui nécessite un investissement initial pour écrire correctement votre Dockerfile et le maintenir au fil du temps. Certaines commandes Docker comme attach ne fonctionneront pas par défaut car il n'y aura pas de shell à l'intérieur de votre conteneur à moins que vous n'en ajoutiez un.

Publicité

L'utilisation de scratch peut être plus problématique que cela n'en vaut la peine lorsque vous utilisez des langages interprétés avec de fortes dépendances environnementales. Vous devrez continuellement mettre à jour votre image de base pour référencer les dernières versions de ces packages. Il est généralement plus pratique et plus facile d'utiliser une version minimale d'une image de base Docker Hub existante.

Résumé

À PARTIR de zéro dans un Dockerfile vous indique voulez commencer à partir d'un système de fichiers vide où vous contrôlez chaque couche ajoutée. Il facilite les images hautement rationalisées purgées de tout, à l'exception des dépendances dont votre application a besoin.

Il est peu probable que la plupart des développeurs utilisent scratch directement car il ne convient pas à la majorité des cas d'utilisation de conteneurs. Vous pouvez choisir de l'utiliser si vous souhaitez conteneuriser des binaires statiques autonomes avec peu d'exigences environnementales.

scratch fonctionne également comme un indicateur clair de la différence entre les “conteneurs” et VM. Une image contenant un seul fichier exécutable est un conteneur Docker utilisable car le processus est exécuté sur le noyau de votre hôte. Une machine virtuelle ordinaire doit démarrer indépendamment de son hôte, elle doit donc inclure un noyau de système d'exploitation complet dans son image.