Lorsque c'est possible, j'ai toujours fusionner ensemble des commandes qui créent des fichiers avec les commandes que supprimer ces fichiers en un seul RUN
ligne de. C'est parce que chaque RUN
ligne en rajoute une couche à l'image, le résultat est tout à fait littéralement les modifications au système de fichiers que vous pouvez afficher avec docker diff
sur le temporaire récipient qu'il crée. Si vous supprimez un fichier qui a été créé dans un calque différent, tout le système de fichiers union n'est d'inscrire le changement de système de fichiers dans un nouveau calque, le fichier existe toujours dans la couche précédente et est livré sur le réseau et stocké sur le disque. Donc, si vous téléchargez le code source, l'extraire, de les compiler dans un binaire, puis supprimez le fichier tgz et des fichiers source à la fin, tu le veux vraiment tout faire en une seule couche pour réduire la taille de l'image.
Ensuite, personnellement, j'ai divisé les couches en fonction de leur potentiel de réutilisation dans d'autres images et attendus de la mise en cache d'utilisation. Si j'ai 4 images, tous avec la même image de base (par exemple debian), j'ai peut tirer une collection d'utilitaires pour la plupart de ces images dans la première manche de commande alors que les autres images de bénéficier de la mise en cache.
De l'ordre dans le Dockerfile est important lorsque l'on regarde l'image du cache de la réutilisation. Je regarde tous les composants qui sera mise à jour très rarement, peut-être seulement quand l'image de base, mises à jour et de mettre ceux-ci en haut dans le Dockerfile. Vers la fin de la Dockerfile, je inclure toutes les commandes qui s'exécutent rapidement et peuvent changer fréquemment, par exemple, l'ajout d'un utilisateur avec un hôte spécifique UID ou la création de dossiers et la modification des autorisations. Si le conteneur comprend le code interprété (ex: JavaScript) qui est activement développée, qui s'ajoute aussi tard que possible, de sorte que la reconstruction ne fonctionne que seul changement.
Dans chacun de ces groupes de changements, j'ai consolider mieux que je peux pour minimiser les couches. Donc si il y a 4 différents code source de dossiers, ceux placés à l'intérieur d'un dossier unique de sorte qu'il peut être ajouté en une seule commande. Un paquet installe à partir de quelque chose comme apt-get sont fusionnées en une seule fois dès que possible afin de minimiser la quantité de gestionnaire de paquets, les frais généraux (mise à jour et de nettoyage).
Mise à jour pour le multi-étape:les versions
Je m'inquiète beaucoup moins sur la réduction de la taille de l'image dans le non-dernières étapes du processus de plusieurs étapes de construction. Lorsque ces étapes ne sont pas étiquetés et envoyés à d'autres nœuds, vous pouvez maximiser la probabilité d'un cache de réutilisation par le fractionnement de chaque commande séparé RUN
ligne de.
Cependant, ce n'est pas une solution parfaite pour l'écrasement des couches depuis tous vous copie entre les étapes sont les fichiers, et pas le reste de l'image des méta-données comme paramètres des variables d'environnement, point d'entrée et de commande. Et lorsque vous installez les paquets dans une distribution linux, les bibliothèques et autres dépendances peuvent être dispersés à travers le système de fichiers, la création d'une copie de toutes les dépendances difficile.
De ce fait, j'utilise le multi-stade construit comme un remplacement pour la construction des binaires sur un CI/CD serveur, de sorte que mon CI/CD serveur n'a besoin que de l'outillage à exécuter docker build
, et ne pas avoir un jdk, nodejs, aller, et tout autres outils de compilation installé.