COPIAR con docker pero con exclusión

Respuestas:

377

Cree un archivo .dockerignoreen el directorio de contexto de compilación de Docker (por lo que, en este caso, lo más probable es que sea un directorio principal de node_modules) con una línea:

**/node_modules

aunque probablemente solo quieras:

node_modules

Información sobre dockerignore: https://docs.docker.com/engine/reference/builder/#dockerignore-file

vith
fuente
55
gracias, entonces la "COPIA". el comando no necesita cambiar, supongo
Alexander Mills
En realidad no: /config/nginx/ /config/logstash/encuentro esto en el contenedor bash:ls config/ gunicorn logs logstash nginx
SalahAdDin
3
@SalahAdDin por la misma razón por la que no escribiste ls /config/, ¿intentaste agregar esas rutas a tu .dockerignore sin el encabezado /?
Pablo
8
Simplemente node_modulesno funciona en subdirectorios.
rustyx
55
Esto realmente no resuelve el problema si quieres copiarlo, pero no en esa capa ...
Wes
33

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.

Alex
fuente
1
Esto no funcionará porque obtendrá un mensaje COPY failed: no source files were specifiedcuando no haya archivos que comiencen con 'no', pero no 'asentir'.
mheck
1
Alternativamente, se pueden utilizar dos subdirectorios diferentes (para diferentes destinos de copia), por lo que por ejemplo, en mi configuración de nginx, tendría que src/irá a /var/wwwe /conf/nginx.confir a /etc/nginx/conf.d/default.conf. Además, puede copiar todo y RUN rm -r confmás tarde (también mantener el árbol de origen como estaba). Me gustaría saber si alguien tiene otra sugerencia.
Yuval
1
¿Cuál sería una solución para tipos de archivo específicos o terminaciones de archivo si lo hiciera así?
Lea Reimann
El único inconveniente de este enfoque es que la estructura de su carpeta está aplanada
Islam Q.
Si solo tiene que copiar algunos directorios (diga solo '/ app' o '/ src'). Una forma más simple sería copiar directorios individualmente (para mantener su estructura) y luego solo necesita uno COPY [^node_modules]*para copiar todos los archivos de nivel superior.
smdufb
9

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

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

Cameron Hudson
fuente
3
Tenga en cuenta por qué tiene que eliminar composer.lockantes composer install. Sin el archivo de bloqueo, se puede instalar un conjunto diferente de dependencias (la carpeta del proveedor) la próxima vez que compile.
Lacek
1
@Lacek: Tienes razón. He aprendido mejor desde que publiqué esto.
Cameron Hudson el
1
@CameronHudson quizás actualice su respuesta original antes de que la gente copie / pegue esta mala práctica.
Robin van Baalen
2

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 , incluya también un punto final, como: .dockerignore.y presione enter (siempre que haya habilitado las opciones de vista de extensión desde las opciones de carpeta)

Paras Patidar
fuente
66
Puede crear un archivo en Windows que comience con un punto y también termine con un punto.
Jim Pedid el
0

Excluyendo node_modules del directorio actual

node_modules

Excluyendo node_modules en cualquier subdirectorio inmediato

*/node_modules

Aquí están los documentos oficiales.

kta
fuente