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?
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?
Respuestas:
Cree un archivo .dockerignore
en 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
/config/nginx/ /config/logstash/
encuentro esto en el contenedor bash:ls config/ gunicorn logs logstash nginx
ls /config/
, ¿intentaste agregar esas rutas a tu .dockerignore sin el encabezado /
?
node_modules
no funciona en subdirectorios.
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.
COPY failed: no source files were specified
cuando no haya archivos que comiencen con 'no', pero no 'asentir'.
src/
irá a /var/www
e /conf/nginx.conf
ir a /etc/nginx/conf.d/default.conf
. Además, puede copiar todo y RUN rm -r conf
más tarde (también mantener el árbol de origen como estaba). Me gustaría saber si alguien tiene otra sugerencia.
COPY [^node_modules]*
para copiar todos los archivos de nivel superior.
En mi caso, mi Dockerfile contenía un paso de instalación, que produjo el vendor
directorio (el equivalente de PHP 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 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 vendor
directorio en el host se copia en el contexto de Docker durante el proceso de compilación, lo que agrega tiempo.
composer.lock
antes 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.
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)
Excluyendo node_modules del directorio actual
node_modules
Excluyendo node_modules en cualquier subdirectorio inmediato
*/node_modules
Aquí están los documentos oficiales.
.dockerignore
?