ARG NODE_VERSION=20.9.0 ################### # BUILD FOR LOCAL DEVELOPMENT ################### FROM docker.io/node:${NODE_VERSION} As development # Create app directory WORKDIR /usr/src/app # Copy application dependency manifests to the container image. # A wildcard is used to ensure copying both package.json AND package-lock.json (when available). # Copying this first prevents re-running npm install on every code change. COPY --chown=node:node package*.json ./ # Copy prisma (needed for prisma error types) COPY --chown=node:node ./prisma prisma # Install app dependencies using the `npm ci` command instead of `npm install` RUN npm ci RUN npx prisma generate # Bundle app source COPY --chown=node:node . . # Use the node user from the image (instead of the root user) USER node ################### # BUILD FOR PRODUCTION ################### FROM docker.io/node:${NODE_VERSION} As build WORKDIR /usr/src/app COPY --chown=node:node package*.json ./ # In order to run `npm run build` we need access to the Nest CLI. # The Nest CLI is a dev dependency, # In the previous development stage we ran `npm ci` which installed all dependencies. # So we can copy over the node_modules directory from the development image into this build image. COPY --chown=node:node --from=development /usr/src/app/node_modules ./node_modules COPY --chown=node:node . . # Copy prisma (needed for migrations) COPY --chown=node:node ./prisma prisma # Copy policies COPY --chown=node:node ./opa opa # Run the build command which creates the production bundle RUN npm run build # Set NODE_ENV environment variable ENV NODE_ENV production # Running `npm ci` removes the existing node_modules directory. # Passing in --omit=dev ensures that only the production dependencies are installed. # This ensures that the node_modules directory is as optimized as possible. RUN npm ci --omit=dev && npm cache clean --force USER node ################### # PRODUCTION ################### FROM docker.io/node:${NODE_VERSION} As production # Copy package.json to be able to execute migration command COPY --chown=node:node package*.json ./ # Copy the bundled code from the build stage to the production image COPY --chown=node:node --from=build /usr/src/app/node_modules ./node_modules COPY --chown=node:node --from=build /usr/src/app/prisma ./prisma COPY --chown=node:node --from=build /usr/src/app/opa ./opa COPY --chown=node:node --from=build /usr/src/app/dist ./dist # Start the server using the production build CMD [ "node", "--trace-warnings", "dist/main.js" ]