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.