tag run remove images hub example dockers docker dockerfile docker-copy

run - dockers images



COPIAR con docker pero con exclusión (4)

En un Dockerfile, tengo

COPY . .

Quiero excluir un directorio completo, en mi caso, el directorio node_modules.

Algo como esto:

COPY [all but **/node_modules/**] .

¿Es esto posible con Docker?


Agregar .dockerignore funciona para mí. Un punto adicional Aquellos que están probando esta solución en Windows , Windows no le permitirá crear un archivo .dockerignore (ya que no lo hace de forma predeterminada, permite crear un archivo que comienza con).

Para crear dicho archivo comenzando con. en Windows , el truco se menciona aquí: https://www.hanselman.com/blog/HowToCreateAFileWithADotPrefixInWindowsExplorer.aspx

que también incluye un punto final, como: .dockerignore. y presione Intro (siempre que haya habilitado las opciones de vista de extensión desde las opciones de carpeta)


Cree el archivo .dockerignore en su directorio contextual de compilación de .dockerignore (por lo que, en este caso, lo más probable es que sea un directorio que sea padre de node_modules) con una línea en él:

**/node_modules

aunque probablemente solo quieras:

node_modules

Información sobre dockerignore: .dockerignore


En mi caso, mi Dockerfile contenía un paso de instalación, que producía el directorio de vendor (el equivalente PHP de node_modules ). Luego COPY este directorio a la imagen final de la aplicación. Por lo tanto, no pude poner vendor en mi .dockerignore . Mi solución fue simplemente eliminar el directorio antes de realizar la composer install (el equivalente en PHP de la npm install 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 .

Esta solución funciona y no hincha la imagen final, pero no es ideal, porque el directorio de vendor en el host se copia en el contexto de Docker durante el proceso de compilación, lo que agrega tiempo.


Para aquellos que no pueden usar un archivo .dockerignore (por ejemplo, si necesita el archivo en una COPIA pero no en otra):

Sí, pero necesita múltiples instrucciones de COPIA. Específicamente, necesita una COPIA para cada letra en el nombre de archivo que desea excluir.

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''

Continuará hasta que tenga el nombre completo del archivo, o solo el prefijo, está razonablemente seguro de que no tendrá ningún otro archivo.