Dans un Dockerfile, j'ai
COPY . .
Je veux exclure un répertoire entier, dans mon cas, le répertoire node_modules.
Quelque chose comme ça:
COPY [all but **/node_modules/**] .
Est-ce possible avec Docker?
docker
dockerfile
docker-copy
Alexander Mills
la source
la source
.dockerignore
?Réponses:
Créez un fichier
.dockerignore
dans votre répertoire de contexte de construction de docker (donc dans ce cas, très probablement un répertoire parent de node_modules) avec une ligne dedans:bien que vous souhaitiez probablement:
Informations sur dockerignore: https://docs.docker.com/engine/reference/builder/#dockerignore-file
la source
/config/nginx/ /config/logstash/
je trouve ça dans le container bash:ls config/ gunicorn logs logstash nginx
ls /config/
, avez-vous essayé d'ajouter ces chemins à votre .dockerignore sans le premier/
?node_modules
fonctionne tout simplement pas dans les sous-répertoires.Pour ceux qui ne peuvent pas utiliser un fichier .dockerignore (par exemple, si vous avez besoin du fichier dans une COPIE mais pas dans une autre):
Oui, mais vous avez besoin de plusieurs instructions COPY. Plus précisément, vous avez besoin d'une COPIE pour chaque lettre du nom de fichier que vous souhaitez exclure.
Continuez jusqu'à ce que vous ayez le nom de fichier complet, ou juste le préfixe dont vous êtes raisonnablement sûr qu'il n'aura pas d'autres fichiers.
la source
COPY failed: no source files were specified
quand il n'y aura pas de fichiers commençant par «non», mais pas par «hochement de tête».src/
ira/var/www
et/conf/nginx.conf
aller/etc/nginx/conf.d/default.conf
. De plus, vous pouvez tout copier, etRUN rm -r conf
plus tard (aussi garder l'arborescence source telle qu'elle était). J'aimerais savoir si quelqu'un a une autre suggestion.COPY [^node_modules]*
pour copier tous les fichiers de niveau supérieur.Dans mon cas, mon Dockerfile contenait une étape d'installation, qui produisait le
vendor
répertoire (l'équivalent PHP denode_modules
). J'ai ensuiteCOPY
ce répertoire sur l'image de l'application finale. Par conséquent, je ne pouvais pas mettrevendor
dans mon.dockerignore
. Ma solution consistait simplement à supprimer le répertoire avant d'effectuercomposer install
(l'équivalent PHP denpm install
).Cette solution fonctionne et ne gonfle pas l'image finale, mais elle n'est pas idéale, car le
vendor
répertoire sur l'hôte est copié dans le contexte Docker pendant le processus de génération, ce qui ajoute du temps.la source
composer.lock
avantcomposer install
. Sans le fichier de verrouillage, un ensemble différent de dépendances (le dossier du fournisseur) peut être installé lors de la prochaine génération.L'ajout de .dockerignore fonctionne pour moi. Un point supplémentaire Ceux qui essaient cette solution sur Windows , Windows ne vous laisseront pas créer de fichier .dockerignore (car il ne permet pas par défaut de créer un fichier commençant par.)
Pour créer un tel fichier commençant par. sous Windows , incluez également un point de fin, comme:
.dockerignore.
et appuyez sur Entrée (à condition que vous ayez activé les options d'extension de vue à partir des options de dossier)la source
Exclusion de node_modules du répertoire actuel
Exclusion de node_modules dans tous les sous-répertoires immédiats
Voici les documents officiels
la source