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?
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?
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:
**/node_modules
bien que vous souhaitiez probablement:
node_modules
Informations sur dockerignore: https://docs.docker.com/engine/reference/builder/#dockerignore-file
/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.
COPY [^n]* # All files that don't start with 'n'
COPY n[^o]* # All files that start with 'n', but not 'no'
COPY no[^d]* # All files that start with 'no', but not 'nod'
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.
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, et RUN 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 de node_modules
). J'ai ensuite COPY
ce répertoire sur l'image de l'application finale. Par conséquent, je ne pouvais pas mettre vendor
dans mon .dockerignore
. Ma solution consistait simplement à supprimer le répertoire avant d'effectuer composer install
(l'équivalent PHP de npm install
).
FROM composer AS composer
WORKDIR /app
COPY . .
RUN rm -rf vendor \
&& composer install
FROM richarvey/nginx-php-fpm
WORKDIR /var/www/html
COPY --from=composer /app .
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.
composer.lock
avant composer 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)
Exclusion de node_modules du répertoire actuel
node_modules
Exclusion de node_modules dans tous les sous-répertoires immédiats
*/node_modules
Voici les documents officiels
.dockerignore
?