Copying node_modules into a dockerfile vs installing them
I'd almost always install Node packages from inside the container rather than COPY
ing them from the host (probably via RUN npm ci
if I was using npm).
If the host environment doesn't exactly match the container environment, COPY
ing the host's node_modules
directory may not work well (or at all). The most obvious case of this using a MacOS or Windows host with a Linux container, where if there are any C extensions or other binaries they just won't work. It's also conceivable that there would be if the Node versions don't match exactly. Finally, and individual developer might have npm install
ed an additional package or a different version, and the image would vary based on who's building it.
Also consider the approach of using a multi-stage build to have both development and production versions of node_modules
; that way you do not include build-only tools like the tsc
Typescript compiler in the final image. If you have two different versions of node_modules
then you can't COPY
a single tree from the host, you must install it in the Dockerfile.
FROM node AS build
WORKDIR /app
COPY package*.json .
RUN npm ci
COPY . .
RUN npm install
FROM node
WORKDIR /app
COPY package*.json .
ENV NODE_ENV=production
RUN npm ci
COPY --from=build /app/build /app/build
CMD ["node", "/app/build/index.js"]