Add a volume to Docker, but exclude a sub-folder
Using docker-compose I'm able to use node_modules locally, but ignore it in the docker container using the following syntax in the docker-compose.yml
volumes:
- './angularApp:/opt/app'
- /opt/app/node_modules/
So everything in ./angularApp
is mapped to /opt/app
and then I create another mount volume /opt/app/node_modules/
which is now empty directory - even if in my local machine ./angularApp/node_modules
is not empty.
If you want to have subdirectories ignored by docker-compose but persistent, you can do the following in docker-compose.yml
:
volumes:
node_modules:
services:
server:
volumes:
- .:/app
- node_modules:/app/node_modules
This will mount your current directory as a shared volume, but mount a persistent docker volume in place of your local node_modules
directory. This is similar to the answer by @kernix, but this will allow node_modules
to persist between docker-compose up
runs, which is likely the desired behavior.
To exclude a file, use the following
volumes:
- /hostFolder:/folder
- /dev/null:/folder/fileToBeExcluded
For those trying to get a nice workflow going where node_modules
isn't overridden by local this might help.
- Change your docker-compose to mount an anonymous persistent volume to node_modules to prevent your local overriding it. This has been outlined in this thread a few times.
services:
server:
build: .
volumes:
- .:/app
- /app/node_modules
- This is the important bit we were missing. When spinning up your stack use
docker-compose -V
. Without this if you added a new package and rebuilt your image it would be using thenode_modules
from your initial docker-compose launch.
-V, --renew-anon-volumes Recreate anonymous volumes instead of retrieving
data from the previous containers.
First, using the ADD
instruction in a Dockerfile is very different from using a volume (either via the -v
argument to docker run
or the VOLUME
instruction in a Dockerfile). The ADD
and COPY
commands just take a copy of the files at the time docker build
is run. These files are not updated until a fresh image is created with the docker build
command. By contrast, using a volume is essentially saying "this directory should not be stored in the container image; instead use a directory on the host"; whenever a file inside a volume is changed, both the host and container will see it immediately.
I don't believe you can achieve what you want using volumes, you'll have to rethink your directory structure if you want to do this.
However, it's quite simple to achieve using COPY
(which should be preferred to ADD
). You can either use a .dockerignore
file to exclude the subdirectory, or you could COPY
all the files then do a RUN rm bla
to remove the subdirectory.
Remember that any files you add to image with COPY
or ADD
must be inside the build context i.e. in or below the directory you run docker build
from.