web-dev-qa-db-fra.com

COPIE avec menu fixe mais avec exclusion

Dans un fichier Docker, 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?

90
Alexander Mills

Créez le fichier .dockerignore dans votre répertoire contextuel de construction de docker (dans ce cas, il s'agit probablement d'un répertoire parent de node_modules) contenant une ligne: 

**/node_modules

bien que vous vouliez probablement juste:

node_modules

Informations sur dockerignore: https://docs.docker.com/engine/reference/builder/#dockerignore-file

158
vith

Dans mon cas, mon fichier Docker comportait une étape d’installation qui produisait le répertoire vendor (l’équivalent PHP de node_modules). J'ai alors COPY ce répertoire sur l'image finale de l'application. 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 composer.lock 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 répertoire vendor de l'hôte est copié dans le contexte de Docker pendant le processus de construction, ce qui ajoute du temps.

5
Cameron Hudson

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 de copie. 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 ne contiendra aucun autre fichier.

2
Alex

Ajouter .dockerignore fonctionne pour moi . Un point supplémentaire Ceux qui essayent cette solution sur Windows, Windows ne vous laissera pas créer le fichier .dockerignore} créer un fichier commençant par.)

le truc à cela est mentionné ici: https://www.hanselman.com/blog/HowToCreateAFileWithADrefPrefixInWindowsExplorer.aspx

qui comprend également un point de fin, tel que: .dockerignore. et appuyez sur Entrée (à condition que vous ayez activé les options d’extension de vue à partir des options de dossier).

1
Paras Patidar