Comprendre le contexte de construction Docker (pourquoi vous devriez utiliser Dockerignore)

  • Principal
  • Nouvelles
  • Comprendre le contexte de construction Docker (pourquoi vous devriez utiliser Dockerignore)

Le contexte de construction Docker fait référence aux fichiers et répertoires qui seront disponibles pour le moteur Docker lors de son exécution. |__+_|. Tout ce qui n'est pas inclus dans le contexte de construction ne sera pas accessible aux commandes de votre |__+_| dossier.

Vous devriez vérifier votre utilisation de |__+_| pour garder les contextes de construction petits. Inclure accidentellement des fichiers inutiles peut entraîner un contexte de génération excessivement volumineux, entraînant des générations plus longues.

Quel est le contexte de construction ?

En voici une simple |__+_| J'envoie:

|__+_|

Cela crée une image Docker en utilisant le |__+_| situé dans votre répertoire de travail. L'image résultante sera marquée comme |__+_|, bien que ce détail ne soit pas important pour ce tutoriel.

Dans votre |__+_|, vous utiliserez probablement |__+_| pour ajouter des fichiers et des dossiers à votre image :

|__+_|

Cet exemple copie le fichier |__+_| fichier et |__+_| répertoire dans votre conteneur. À première vue, il semble que le |__+_| la déclaration fait simplement référence à un chemin qui a été résolu par rapport au répertoire de travail.

Ce n'est pas le cas. |__+_| vous ne pouvez accéder qu'aux ressources disponibles dans le contexte de construction. Dans cet exemple, le contexte de construction est le répertoire de travail, donc les fichiers et dossiers qu'il contient sont disponibles. Par défaut, Docker utilise le contenu du répertoire passé à |__+_| comme contexte de construction.

Pourquoi le contexte de construction est-il utilisé ?

Le contexte de génération est important car la CLI Docker et le moteur Docker peuvent ne pas s'exécuter sur la même machine. Lorsque vous exécutez |__+_|, la CLI envoie les fichiers et dossiers à construire au moteur Docker. Cet ensemble de fichiers et de dossiers devient le contexte de construction.

De plus, tous les contextes de construction ne sont pas aussi simples que de réutiliser le répertoire de travail. Docker prend également en charge les URL de référentiel Git en tant que chemin donné vers |__+_|. Dans ce cas, le contexte de génération devient le contenu du référentiel spécifié.

Le comportement de contexte de construction par défaut « inclure tout » convient à de nombreux petits référentiels. Les problèmes deviennent apparents lorsque vous ajoutez des fichiers à votre répertoire de travail que le vôtre n'utilise pas |__+_|. Les ressources telles que les fichiers binaires par défaut, les fichiers de documentation et les bibliothèques de dépendances seront incluses dans le contexte de construction même si elles sont redondantes.

Inclure trop de ressources dans le contexte de génération peut dégrader les performances. Vous copiez inutilement des fichiers qui ne seront jamais utilisés. Le ralentissement sera particulièrement visible si vous êtes connecté à un démon Docker distant ou si vous utilisez un disque dur mécanique lent. Vous verrez 'envoyer le contexte de construction au démon Docker' dans votre shell à la fin de la copie.

Docker essaie lui-même de minimiser les copies redondantes. Le backend de build buildKit : utilisé depuis Docker 18.09 —Ajout de la prise en charge des transferts incrémentiels. Cela signifie que Docker n'aura généralement besoin que de copier les fichiers ajoutés ou modifiés depuis la dernière version. Il continuera à copier le lot entier sur la première version.

Exclusion de ressources du contexte de génération

Pour corriger définitivement le gaspillage de copie, vous devez indiquer à Docker ce qu'il faut omettre du contexte de construction. Commençons par créer un fichier. |__+_| :

|__+_|

Ce simple |__+_| pourrait être utilisé par une application écrite en Node.js. Les programmes Node.js utilisent |__+_| en tant que gestionnaire de paquets. Les packages sont installés dans un fichier |__+_| liant. Lorsque vous exécutez |_+_| localement, pendant le développement, les packages seront téléchargés sur |__+_| dossier dans le répertoire de travail.

le |__+_| courses |__+_| lui-même pour acquérir les dépendances. Cela garantit que l'image est complètement autonome. Pas besoin de copier dans un fichier Local |__+_| dossier, car il n'est pas utilisé par le |__+_| dossier.

Malgré cela, Docker inclura toujours le |__+_| dossier dans le contexte de génération par défaut. Pour l'exclure, créez un fichier. |__+_| fichier dans le répertoire de travail. Ce fichier a une syntaxe similaire à |__+_|.

|__+_|

Tous les itinéraires répertoriés dans |__+_| sera exclu du contexte de construction. Vous devez vous assurer que |__+_| suit les changements dans la structure du système de fichiers du projet. Vous pouvez réduire considérablement le temps de copie du contexte de construction Docker en vérifiant que seuls les chemins pertinents (ceux réellement utilisés par votre |__+_|) sont présents dans le contexte de construction.

Dans le cas de notre exemple, le |__+_| Le dossier peut inclure des milliers de fichiers si nous avons beaucoup de dépendances dans notre projet. Les copier dans le démon Docker dans le cadre du contexte de construction peut prendre plusieurs secondes et coûter cher. le |__+_| il les ignore entièrement, revendiquant leurs dépendances via |_+_| à la place de.

Autres problèmes de contexte de construction

Non utilisé |__+_| il peut également introduire d'autres problèmes. Un Dockerfile avec cette ligne est particulièrement problématique :

|__+_|

Cela copiera tout dans votre répertoire de travail. Cela peut sembler être une bonne idée jusqu'à ce que vous réalisiez la vôtre. |__+_| l'historique et tous les fichiers secrets se retrouveront également dans votre conteneur.

La copie d'un contexte de construction non filtré empêche également la mise en cache au niveau Docker de fonctionner efficacement. Je l'aime bien quelque chose dans votre répertoire de travail changera probablement entre les versions, Docker devrait exécuter le fichier |__+_| instructions à chaque fois. Cela créerait un nouveau niveau et de nouveaux niveaux pour toutes les instructions ultérieures, même si les ressources qui vous intéressent n'ont pas changé.

Compresser le contexte de construction

Vous pouvez compresser le contexte de génération pour améliorer encore les performances de génération. Passez le |__+_| marquer un |__+_| pour appliquer la compression gzip. La compression se produit avant que le contexte ne soit envoyé au démon Docker.

|__+_|

Cela peut améliorer les performances dans certains scénarios. Cependant, la compression ajoute sa propre surcharge : le système doit maintenant compresser le contexte et le démon Docker récepteur doit le décompresser. L'utilisation de la compression peut être plus lente que la copie des fichiers d'origine dans certaines circonstances. Expérimentez avec chacune de vos images pour voir si vous voyez une amélioration.

conclusion

Le contexte de construction Docker définit les fichiers qui seront disponibles pour être copiés sur votre |__+_| archive. Le contexte de génération est copié dans le démon Docker avant le début de la génération.

Les contextes de génération incluent par défaut le contenu du référentiel ou du répertoire Git que vous avez remplacé par |__+_|. Vous pouvez omettre des éléments du contexte de construction en créant un |__+_| procédure. Cela augmente l'efficacité en réduisant la quantité de données redondantes transmises au démon Docker.

Qu'est-ce que tu penses?