In a Dockerfile, I have
COPY . .
I want to exclude an entire directory, in my case, node_modules directory.
Something like this:
COPY [all but **/node_modules/**] .
Is this possible with Docker?
This question is related to
docker
dockerfile
docker-copy
FOR A ONE LINER SOLUTION, type the following in Command prompt or Terminal at project root.
echo node_modules > .dockerignore
This creates the extension-less . prefixed file without any issue. Replace node_modules with the folder you want to exclude.
For those who can't use a .dockerignore file (e.g. if you need the file in one COPY but not another):
Yes, but you need multiple COPY instructions. Specifically, you need a COPY for each letter in the filename you wish to exclude.
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'
Continuing until you have the full file name, or just the prefix you're reasonably sure won't have any other files.
For those using gcloud build:
gcloud build
ignores .dockerignore
and looks instead for .gcloudignore
Use:
cp .dockerignore .gcloudignore
In my case, my Dockerfile contained an installation step, which produced the vendor
directory (the PHP equivalent of node_modules
). I then COPY
this directory over to the final application image. Therefore, I could not put vendor
in my .dockerignore
. My solution was simply to delete the directory before performing composer install
(the PHP equivalent of 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 .
This solution works and does not bloat the final image, but it is not ideal, because the vendor
directory on the host is copied into the Docker context during the build process, which adds time.
Excluding node_modules from current directory
node_modules
Excluding node_modules in any immediate subdirectories
*/node_modules
Here is the official docs
Adding .dockerignore works for me. One additional point Those who are trying this solution on Windows , windows will not let you create .dockerignore file (as it doesn't by default allows creating file starting with .)
To create such file starting with . on Windows, include an ending dot also, like : .dockerignore.
and hit enter ( provided you have enabled view extension options from folder options )
Source: Stackoverflow.com