Ce matin en parcourant la documentation de
pipenv j’ai redécouvert qu’il était possible
de packager l’application avec l’option —deploy. Et la le déclic et si cette
méthode permettait de réduire la taille de mes containers utilisant python.
En parcourant quelques sites j’ai vu que cela pouvait fonctionner. Cela vient
compléter mon précédent billet d’optimisation des images
docker.
Mise en pratique
J’ai repris l’image d’ansible-lint et j’ai modifié l’image de build pour qu’elle :
installe pipenv.
copie le fichier Pipfile
et installe les packages dans le répertoire venv
Le contenu du Pipfile:
Je lance le build :
Je lance le container pour la première fois:
Oh il n’affiche pas la version. Un détail? Fonctionne t’il ?
On le teste sur un playbook :
Ca marche !!!!
La taille de l’image est de :
Le choc on est passé de 1.9Gb à 451Mb avec venv et maintenant à 146Mb avec pipenv. Good job!
A tester sur d’autres projets python.
Mais attention la taille ne fait pas tout. Utiliser une Alpine Linux peut
parfois avoir des effets secondaires. En effet, par exemple sur les projets
python contrairement à d’autres distributions Alpine ne met à disposition
qu’un seul package wheel (binaire précompilé). Du coup il
recompile tout à partir du code source et parfois ca peut être très très long
…
Un exemple les packages cryptography et lxml.