J'ai créé quelques répertoires différents sur ma machine hôte alors que j'essaie d'en apprendre davantage sur Docker juste pour garder mes fichiers docker organisés. Mon Dockerfile que je viens d'exécuter ressemble à ceci:
FROM crystal/centos
MAINTAINER crystal
ADD ./rpms/test.rpm ./rpms/
RUN yum -y --nogpgcheck localinstall /rpms/test.rpm
Mon régime réel n'est que de 1 Go. Mais quand j'essaye de le faire sudo docker build -t="crystal/test" .
, j'envoie le contexte de construction au démon Docker 3,5 Go. Y a-t-il autre chose dont je ne suis pas au courant alors que vous continuez à créer des images Docker? Ma mémoire s'accumule-t-elle à mesure que je construis plus d'images dans mes autres répertoires sur ma machine hôte?
.dockerignore
Réponses:
Le client Docker envoie l'intégralité du «contexte de construction» au démon Docker. Ce contexte de construction (par défaut) est le répertoire entier dans lequel se
Dockerfile
trouve (donc, l'rpms
arborescence entière ).Vous pouvez configurer un
.dockerignore
fichier pour que Docker ignore certains fichiers. Vous voudrez peut-être l'expérimenter.Vous pouvez également déplacer votre
rpms
dossier d'un niveau de répertoire au-dessus de votreDockerfile
, et uniquement le lien symboliquetest.rpm
dans leDockerfile
répertoire s.Comme de nombreux utilisateurs l'ont souligné dans les commentaires, il faut ajouter le
.git
dossier au dossier.dockerignore
qui était à l'origine d'une différence de 150 Mo -> 5 Go dans mon cas.la source
ADD
commande ne suit pas les liens symboliques pendant une construction. Voir: github.com/docker/docker/issues/1676tmp
log
à.dockerignore
+ d'autres personnalisés.git
dossier est inclus par défaut - cela m'a définitivement surpris.Mise à jour 2019
À partir de Docker v18.06, il existe une option pour utiliser un nouveau générateur d'images appelé Build Kit .
Il est pré-fourni avec le Docker, pas besoin d'installer quoi que ce soit. Il est rétrocompatible avec la
Dockerfile
syntaxe, pas besoin de changer leDockerfile
.Ancienne version de Docker vs nouveau Docker BuildKit
Voici un exemple de construction d'une image avec un énorme fichier inutilisé dans le répertoire de construction:
Ancienne version de Docker:
Nouveau Docker BuildKit:
Le seul changement est la
DOCKER_BUILDKIT=1
variable d'environnement, la différence de temps est énorme..dockerignore
FichierVeuillez noter que le
.dockerignore
fichier est toujours valide et utile. CertainesDockerfile
commandes commeCOPY . .
prendront toujours en compte les.dockerignore
règles. Mais les fichiersDockerfile
annexes dans le répertoire de construction (non référencés dans le ) ne sont plus copiés en tant que "contexte de construction" par le BuildKit.la source
Je l'ai corrigé en déplaçant mon Dockerfile et docker-compose.yml dans un sous-dossier et cela a très bien fonctionné. Apparemment, docker envoie le dossier actuel au démon et mon dossier était de 9 concerts.
la source
Si vous avez un
.dockerignore
fichier et que le contexte de construction est toujours volumineux, vous pouvez vérifier ce qui est envoyé au contexte de construction du docker à l'aide de Silver Searcher :Notez que certains
**
modèles peuvent ne pas fonctionner correctement.Consultez ce numéro de Github pour des commentaires supplémentaires: https://github.com/moby/moby/issues/16056
la source
Dans mon cas, c'était quand j'exécute avec de mauvais
-f
arguments - sans chemin vers le répertoire où se trouve Dockerfiledocker build --no-cache -t nginx5 -f /home/DF/Dockerfile /home/DF/
- droitedocker build --no-cache -t nginx5 -f /home/DF/Dockerfile
- fauxla source
Si vous voulez avoir le contrôle total de votre contexte de construction, vous pouvez également créer le conteneur complètement sans aucun contexte ni
COPY
données pertinentes dans le conteneur par la suite.Un inconvénient serait qu'avec cette approche, vous ne pouvez que des
ADD
éléments du fichier docker référençant à une URL distante, et non des fichiers de votre hôte local.Voir https://docs.docker.com/engine/reference/commandline/build/#build-with--
la source
J'ai eu le même problème que FreeStyler. Cependant, je construisais à partir d'un répertoire à partir de mon contexte. Ainsi, les arguments -f étaient corrects, le contexte était incorrect.
Construire à partir du docker-dir ce qui suit était bien
La construction à partir du répertoire-dock a changé le contexte de construction. Par conséquent, j'avais besoin de changer le contexte dans la commande. Le contexte est donné par le '.' dans la commande ci-dessus.
La nouvelle commande du répertoire du projet doit être
Le contexte ici est donné par le './base'
la source
si vous créez une image et recevez un message envoyant un contexte de construction au démon docker qui prend du temps à copier,
puis ajoutez le fichier .dockerignore . il doit inclure les fichiers ou le répertoire qui n'ont pas besoin d'être copiés.
la source
Pour
NodeJS Application
, ajoutez un.dockerignore
fichier à votre répertoire de projet racine et à l'intérieur du.dockerignore
fichier, ajoutez ce qui suitla source