Docker Tip #75: How to Avoid node_modules in Your Volume Mounts
Volume mounts are great in development, but it's usually not great when you end up with node_modules on your Docker host.
I don’t know about you but, I’m not a fan of having 5 trillion Javascript files
end up on my Docker host because the node_modules
directory happens to have
gotten volume mounted. This would typically happen if you were volume mounting
.:/app
in development.
If you’re using yarn, you can prevent that from happening very easily without having to resort to using hacks.
1. Create a .yarnrc
file in the same location as your package.json
:
Then add this line to the file: --modules-folder /node_modules
.
By doing that, your node modules will get installed to /node_modules
instead
of relative to your package.json
file which means they won’t be volume mounted
back to your dev box if you do a volume mount such as .:/app
.
2. Adjust your Dockerfile
:
You’re likely copying in your package.json
file before you copy in all of your
code to leverage Docker’s ability to cache layers.
Adjust that COPY line to be: COPY package.json *yarn* ./
Now your .yarnrc
(and yarn.lock
) will be copied along with your package.json
.
3. Update any script paths:
With your node modules living in /node_modules
, you may need to update certain
script paths if you reference them, such as using webpack
.
Now you would reference /node_modules/webpack/bin/webpack.js --mode=production -p
or whatever script you’re planning to run.
This same strategy applies to other language package managers that install dependencies to relative folders by default (such as Mix with Elixir or Composer with PHP).