diff --git a/apps/nextjs/Dockerfile b/apps/nextjs/Dockerfile new file mode 100644 index 000000000..ccac7c43f --- /dev/null +++ b/apps/nextjs/Dockerfile @@ -0,0 +1,78 @@ +ARG NODE_VERSION=20 +ARG APP_DIRNAME=nextjs +ARG PROJECT=@acme/nextjs + +# 1. Alpine image +FROM node:${NODE_VERSION}-alpine AS alpine +RUN apk update +RUN apk add --no-cache libc6-compat + +# Setup pnpm and turbo on the alpine base +FROM alpine AS base +RUN corepack enable +# Replace with the major version installed in your repository. For example: +# RUN npm install turbo@2.1.3 --global +RUN npm install turbo --global + +RUN pnpm config set store-dir ~/.pnpm-store + +# 2. Prune projects +FROM base AS pruner +# https://stackoverflow.com/questions/49681984/how-to-get-version-value-of-package-json-inside-of-dockerfile +# RUN export VERSION=$(npm run version) + +ARG PROJECT + +# Set working directory +WORKDIR /app + +# It might be the path to turborepo +COPY . . + +# Generate a partial monorepo with a pruned lockfile for a target workspace. +# Assuming "@acme/nextjs" is the name entered in the project's package.json: { name: "@acme/nextjs" } +RUN turbo prune --scope=${PROJECT} --docker + +# 3. Build the project +FROM base AS builder +ARG PROJECT + +# Environment to skip .env validation on build +ENV CI=true + +WORKDIR /app + +# Copy lockfile and package.json's of isolated subworkspace +COPY --from=pruner /app/out/pnpm-lock.yaml ./pnpm-lock.yaml +COPY --from=pruner /app/out/pnpm-workspace.yaml ./pnpm-workspace.yaml +COPY --from=pruner /app/out/json/ . + +# First install the dependencies (as they change less often) +RUN --mount=type=cache,id=pnpm,target=~/.pnpm-store pnpm install --frozen-lockfile + +# Copy source code of isolated subworkspace +COPY --from=pruner /app/out/full/ . + +RUN pnpm build --filter=${PROJECT} + +# 4. Final image - runner stage to run the application +FROM base AS runner +ARG APP_DIRNAME + +# Don't run production as root +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs +USER nextjs + +WORKDIR /app + +ENV NODE_ENV=production + +COPY --from=builder --chown=nextjs:nodejs /app . +WORKDIR /app/apps/${APP_DIRNAME} + +ARG PORT=3000 +ENV PORT=${PORT} +EXPOSE ${PORT} + +CMD ["pnpm", "start"]