# Install dependencies only when needed FROM node:lts-alpine AS deps WORKDIR /opt/app COPY package.json package-lock.json ./ RUN npm install --frozen-lockfile # Rebuild the source code only when needed # This is where because may be the case that you would try # to build the app based on some `X_TAG` in my case (Git commit hash) # but the code hasn't changed. FROM node:lts-alpine AS builder ENV NODE_ENV=production WORKDIR /opt/app COPY . . COPY --from=deps /opt/app/node_modules ./node_modules RUN npm run build # Production image, copy all the files and run next FROM node:lts-alpine AS runner EXPOSE 3000 ARG X_TAG WORKDIR /opt/app ENV NODE_ENV=production COPY --from=builder /opt/app/next.config.js ./ COPY --from=builder /opt/app/public ./public COPY --from=builder /opt/app/.next ./.next COPY --from=builder /opt/app/node_modules ./node_modules CMD ["node_modules/.bin/next", "start"]