# ============================================ # Re:Link Turborepo Multi-stage Dockerfile # Usage: docker build --build-arg APP_NAME=web . # ============================================ # --- Stage 1: Base --- FROM node:20-alpine AS base RUN apk add --no-cache libc6-compat RUN corepack enable && corepack prepare pnpm@8.10.0 --activate WORKDIR /app # --- Stage 2: Install & Build --- FROM base AS builder ARG APP_NAME=web # Copy workspace config first for better caching COPY pnpm-lock.yaml pnpm-workspace.yaml package.json turbo.json ./ COPY apps/web/package.json ./apps/web/ COPY apps/admin/package.json ./apps/admin/ COPY packages/shared/package.json ./packages/shared/ COPY packages/domain/package.json ./packages/domain/ COPY packages/application/package.json ./packages/application/ COPY packages/infrastructure/package.json ./packages/infrastructure/ COPY packages/database/package.json ./packages/database/ COPY packages/analytics/package.json ./packages/analytics/ COPY packages/ui/package.json ./packages/ui/ RUN pnpm install --frozen-lockfile # Copy all source code COPY . . # Generate Prisma client & build RUN cd packages/database && npx prisma generate RUN pnpm turbo run build --filter=@relink/${APP_NAME} # --- Stage 3: Runner --- FROM node:20-alpine AS runner ARG APP_NAME=web ENV NODE_ENV=production ENV APP_NAME=${APP_NAME} RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 nextjs WORKDIR /app # Ensure public dir exists (some apps may not have one) RUN mkdir -p ./public COPY --from=builder /app/apps/${APP_NAME}/public/ ./public/ COPY --from=builder --chown=nextjs:nodejs /app/apps/${APP_NAME}/.next/standalone ./ COPY --from=builder --chown=nextjs:nodejs /app/apps/${APP_NAME}/.next/static ./apps/${APP_NAME}/.next/static USER nextjs EXPOSE 3000 ENV HOSTNAME="0.0.0.0" ENV PORT=3000 CMD ["sh", "-c", "node apps/${APP_NAME}/server.js"]