diff --git a/nestjs.Dockerfile b/nestjs.Dockerfile new file mode 100644 index 0000000..b2a1eae --- /dev/null +++ b/nestjs.Dockerfile @@ -0,0 +1,61 @@ +############################### +# BUILD FOR LOCAL DEVELOPMENT # +############################### + +FROM node:18-alpine 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 ./ + +# Install app dependencies using the `npm ci` command instead of `npm install` +RUN npm ci + +# 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 node:18-alpine As build + +WORKDIR /usr/src/app + +COPY --chown=node:node package*.json ./ + +# 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 +COPY --chown=node:node --from=development /usr/src/app/node_modules ./node_modules + +COPY --chown=node:node . . + +# Run the build command which creates the production bundle +RUN npm run build + +# Set NODE_ENV environment variable +ENV NODE_ENV production + +# Passing in --omit=dev ensures that only the production dependencies are installed. +RUN npm ci --omit=dev && npm cache clean --force + +USER node + +################### +# PRODUCTION +################### + +FROM node:18-alpine As production + +# 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/dist ./dist + +# Start the server using the production build +CMD [ "node", "dist/main.js" ]