[rĂ©fĂ©rence au conte pour enfants amĂ©ricain « Le Petit Train Qui Peut » (« The Little Engine That Could ») â note du trad.]

Comment créer automatiquement de petites images Docker selon vos besoins
Une obsession inhabituelle
Depuis quelques mois, j'Ă©tais obsĂ©dĂ© par une idĂ©e fixe : jusqu'oĂč peut-on rĂ©duire une image Docker tout en permettant Ă l'application de fonctionner ?
Je comprends, l'idée semble étrange.
Avant de plonger dans les dĂ©tails et les subtilitĂ©s techniques, je voudrais expliquer pourquoi ce problĂšme mâa tant interpellĂ© et en quoi il vous concerne.
Pourquoi la taille compte
En réduisant le contenu de l'image Docker, nous minimisons également la liste des vulnérabilités. De plus, nous rendons les images plus propres, car elles contiennent uniquement ce qui est nécessaire au fonctionnement des applications.
Il y a un autre petit avantage â les images se tĂ©lĂ©chargent un peu plus vite, mais personnellement, je ne pense pas que cela soit si important.
Ă noter : Si la taille vous prĂ©occupe, les images Alpine sont par elles-mĂȘmes petites et conviendront certainement Ă vos besoins.
Images distroless
propose une collection de « distroless » de base, ne contenant pas de gestionnaires de paquets, de shells et d'autres utilitaires que vous avez l'habitude de voir dans une ligne de commande. Par conséquent, vous ne pouvez pas utiliser des gestionnaires de paquets comme pip et apt :
FROM gcr.io/distroless/python3
RUN pip3 install numpyDockerfile utilisant l'image distroless Python 3
Envoi du contexte de construction au démon Docker 2.048kB
Ătape 1/2 : FROM gcr.io/distroless/python3
---> 556d570d5c53
Ătape 2/2 : RUN pip3 install numpy
---> Exécution dans dbfe5623f125
/bin/sh: 1: pip3: introuvableAucun pip dans l'image
Ce problÚme est généralement résolu par une construction multi-étapes :
FROM python:3 as builder
RUN pip3 install numpy
FROM gcr.io/distroless/python3
COPY --from=builder /usr/local/lib/python3.7/site-packages /usr/local/lib/python3.5/Construction multi-étapes
Ă l'arrivĂ©e, on obtient une image de 130 Mo. Ce n'est pas si mal ! Pour comparer : l'image Python par dĂ©faut pĂšse 929 Mo, tandis que la version « allĂ©gĂ©e » (3,7-slim) â 179 Mo, l'image alpine (3,7-alpine) â 98,6 Mo, alors que l'image distroless de base utilisĂ©e dans l'exemple â 50,9 Mo.
On peut légitimement souligner que dans l'exemple précédent, nous copions un répertoire entier /usr/local/lib/python3.7/site-packages, qui peut contenir des dépendances dont nous n'avons pas besoin. Il est clair que la différence de taille entre toutes les images de base Python existantes varie.
Au moment de la rĂ©daction de ces lignes, Google distroless prend en charge encore peu d'images : Java et Python â en phase expĂ©rimentale, et Python n'existe que pour 2.7 et 3.5.
Petites images
Revenons à ma passion pour la création de petites images.
En fait, je voulais voir comment fonctionnent les images distroless. Le projet distroless utilise l'outil de construction de Google bazel. Cependant, pour installer Bazel et Ă©crire mes propres images, cela a nĂ©cessitĂ© pas mal d'efforts (et pour ĂȘtre tout Ă fait honnĂȘte, rĂ©inventer la roue est Ă la fois amusant et instructif). Je voulais simplifier la crĂ©ation d'images rĂ©duites : le processus de crĂ©ation d'une image devrait ĂȘtre d'une simplicitĂ© extrĂȘme, banale. Afin qu'il n'y ait aucun fichier de configuration, juste une ligne dans la console : il suffit de construire une image pour.
Donc, si vous souhaitez crĂ©er vos propres images, sachez qu'il existe une image Docker unique, scratch. Scratch est une image "vide", elle ne contient pas de fichiers, bien qu'elle pĂšse par dĂ©faut â wow ! â 77 octets.
FROM scratchL'image scratch
L'idée de l'image scratch est que vous pouvez copier toutes les dépendances depuis la machine hÎte et soit les utiliser à l'intérieur du Dockerfile (c'est comme les copier dans apt et installer à partir de zéro), soit plus tard, lorsque l'image Docker est matérialisée. Cela permet de contrÎler entiÚrement le contenu du conteneur Docker et ainsi de contrÎler complÚtement la taille de l'image.
Maintenant, nous devons d'une certaine maniÚre rassembler ces dépendances. Les outils existants comme apt permettent de télécharger des paquets, mais ils sont liés à la machine actuelle et, finalement, ne supportent pas Windows ou MacOS.
Ainsi, j'ai décidé de créer mon propre outil qui rassemblerait automatiquement une image de base de la plus petite taille possible tout en exécutant n'importe quelle application. J'ai utilisé des paquets Ubuntu/Debian, j'ai fait un échantillonnage (obtenant des paquets directement depuis les dépÎts) et j'ai trouvé leurs dépendances de maniÚre récursive. Le programme devait télécharger automatiquement la derniÚre version stable du paquet, minimisant ainsi les risques de sécurité.
J'ai nommĂ© l'outil fetchy, car il⊠trouve et apporte⊠ce dont vous avez besoin [de l'anglais « fetch », « apporter » â N.D.T.]. L'outil fonctionne via une interface en ligne de commande, mais propose Ă©galement une API.
Pour créer une image en utilisant fetchy (prenons cette fois l'image Python), il vous suffit d'utiliser le CLI comme suit : fetchy dockerize python. On peut vous demander le systÚme d'exploitation cible et le nom de code, car fetchy utilise pour l'instant uniquement des paquets basés sur Debian et Ubuntu.
Vous pouvez maintenant choisir quelles dépendances ne sont vraiment pas nécessaires (dans notre contexte) et les exclure. Par exemple, Python dépend de Perl, bien qu'il fonctionne parfaitement sans que Perl soit installé.
Résultats
L'image Python, créée avec la commande fetchy dockerize python3.5 pÚse seulement 35Mo (je suis plus que sûr qu'à l'avenir, il sera possible de l'alléger encore plus). Ainsi, l'image distroless a réussi à réduire encore 15Mo.
Vous pouvez voir toutes les images collectées jusqu'à présent .
Le projet â .
Si vous avez besoin de fonctionnalitĂ©s supplĂ©mentaires, crĂ©ez simplement une demande â je serai heureux de vous aider đ. En fait, je travaille actuellement sur l'intĂ©gration d'autres gestionnaires de paquets dans fetchy, afin d'Ă©liminer le besoin de constructions multi-Ă©tapes.
Source : habr.com
