managarten/docker/templates/Dockerfile.nestjs
2025-11-27 17:26:18 +01:00

88 lines
2.3 KiB
Text

# Multi-stage Dockerfile for NestJS backend services
# This is a template - copy and customize for each backend service
# ============================================
# Build Stage
# ============================================
FROM node:20-alpine AS builder
# Install pnpm
RUN corepack enable && corepack prepare pnpm@9.15.0 --activate
WORKDIR /app
# Copy workspace files
COPY pnpm-workspace.yaml ./
COPY package.json ./
COPY pnpm-lock.yaml ./
# Copy all shared packages (adjust based on dependencies)
COPY packages/ ./packages/
# Copy the specific backend service
# CUSTOMIZE THIS: Replace with your service path
# Example: COPY apps/chat/apps/backend ./apps/chat/apps/backend
ARG SERVICE_PATH
COPY ${SERVICE_PATH} ./${SERVICE_PATH}
# Install all dependencies (including devDependencies for build)
RUN pnpm install --frozen-lockfile
# Build shared packages first
RUN pnpm run build:packages
# Build the backend service
WORKDIR /app/${SERVICE_PATH}
RUN pnpm build
# ============================================
# Production Stage
# ============================================
FROM node:20-alpine AS production
# Install pnpm and system dependencies
RUN corepack enable && corepack prepare pnpm@9.15.0 --activate \
&& apk add --no-cache \
postgresql-client \
curl \
wget
WORKDIR /app
# Copy workspace files
COPY --from=builder /app/pnpm-workspace.yaml ./
COPY --from=builder /app/package.json ./
COPY --from=builder /app/pnpm-lock.yaml ./
# Copy built packages and service
COPY --from=builder /app/packages ./packages
ARG SERVICE_PATH
COPY --from=builder /app/${SERVICE_PATH} ./${SERVICE_PATH}
# Install production dependencies only
RUN pnpm install --prod --frozen-lockfile
# Create non-root user
RUN addgroup -g 1001 -S nodejs && \
adduser -S nestjs -u 1001
# Change ownership
RUN chown -R nestjs:nodejs /app
# Switch to non-root user
USER nestjs
# Set working directory to service
WORKDIR /app/${SERVICE_PATH}
# Expose port (customize per service)
ARG PORT=3000
EXPOSE ${PORT}
# Health check (customize endpoint per service)
ARG HEALTH_PATH=/health
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
CMD wget --no-verbose --tries=1 --spider http://localhost:${PORT}${HEALTH_PATH} || exit 1
# Start the application
CMD ["node", "dist/main.js"]