From 70a560724df05d8b6e0f56d328bfa0af048fde0c Mon Sep 17 00:00:00 2001 From: Arthur Belleville Date: Sat, 15 Nov 2025 09:02:36 +0100 Subject: [PATCH] Rollback dockerfile --- apps/api/Dockerfile | 95 +++++++++++++++++++++++---------------------- 1 file changed, 48 insertions(+), 47 deletions(-) diff --git a/apps/api/Dockerfile b/apps/api/Dockerfile index bc33459..7d465fd 100644 --- a/apps/api/Dockerfile +++ b/apps/api/Dockerfile @@ -3,76 +3,76 @@ # ============================================================================== # NOTE: This Dockerfile should be built from the monorepo root, not from apps/api # Build command: docker build -f apps/api/Dockerfile -t xtablo-api . -# Following pnpm Example 3 for CI/CD without BuildKit cache mounts -FROM node:20-slim AS base +FROM node:20-alpine AS base -# Configure pnpm -ENV PNPM_HOME="/pnpm" -ENV PATH="$PNPM_HOME:$PATH" -RUN corepack enable +# Build argument for NODE_ENV +ARG NODE_ENV=production -# ============================================================================== -# Build stage - Install all dependencies and build -# ============================================================================== -FROM base AS build +# Install security updates and pnpm +RUN apk --no-cache upgrade && \ + corepack enable && \ + corepack prepare pnpm@latest --activate -# Copy only lockfile first for better layer caching -COPY pnpm-lock.yaml /app/pnpm-lock.yaml +# Create app directory and set up non-root user WORKDIR /app +RUN addgroup -g 1001 -S nodejs +RUN adduser -S nodejs -u 1001 -# Fetch all dependencies (including devDependencies for build) -RUN pnpm fetch +# Copy workspace configuration and root package files +COPY pnpm-workspace.yaml package.json pnpm-lock.yaml ./ -# Copy source files -COPY . /app +# Copy packages directory (shared packages) +COPY packages ./packages -# Install all dependencies from fetched cache -RUN pnpm install --frozen-lockfile --offline +# Copy api app package.json +COPY apps/api/package.json ./apps/api/package.json -# Build the API +# ============================================================================== +# Dependencies stage - Install all dependencies +# ============================================================================== +FROM base AS deps + +# Install all dependencies (including devDependencies for build) +# This installs dependencies for the entire workspace +RUN pnpm install --frozen-lockfile + +# ============================================================================== +# Build stage - Compile TypeScript +# ============================================================================== +FROM deps AS build + +# Copy api source code +COPY apps/api ./apps/api + +# Build the api application WORKDIR /app/apps/api RUN pnpm run build # ============================================================================== -# Production dependencies stage +# Production dependencies stage - Install only production dependencies # ============================================================================== FROM base AS prod-deps -# Copy only lockfile first -COPY pnpm-lock.yaml /app/pnpm-lock.yaml -WORKDIR /app - -# Fetch only production dependencies -RUN pnpm fetch --prod - -# Copy workspace files needed for install -COPY pnpm-workspace.yaml package.json /app/ -COPY packages /app/packages -COPY apps/api/package.json /app/apps/api/package.json - -# Install production dependencies from fetched cache -RUN pnpm install --prod --frozen-lockfile --offline +# Install only production dependencies +RUN pnpm install --frozen-lockfile --prod && pnpm store prune # ============================================================================== # Final stage - Production image # ============================================================================== -FROM base +FROM base AS final -# Create non-root user -RUN groupadd --gid 1001 nodejs && \ - useradd -l --uid 1001 --gid nodejs --shell /bin/bash --create-home nodejs +# Copy built api application +COPY --from=build /app/apps/api/dist ./apps/api/dist +COPY --from=build /app/apps/api/package.json ./apps/api/package.json -# Copy production dependencies from prod-deps stage -COPY --from=prod-deps /app/node_modules /app/node_modules -COPY --from=prod-deps /app/packages /app/packages +# Copy shared packages (needed for workspace resolution) +COPY --from=prod-deps /app/packages ./packages -# Copy built application from build stage -COPY --from=build /app/apps/api/dist /app/apps/api/dist -COPY --from=build /app/apps/api/package.json /app/apps/api/package.json -COPY --from=build /app/pnpm-workspace.yaml /app/pnpm-workspace.yaml -COPY --from=build /app/package.json /app/package.json +# Install production dependencies +# This ensures proper symlink structure for pnpm +RUN pnpm install --frozen-lockfile --prod --filter @xtablo/api... -# Set working directory +# Set working directory to api app WORKDIR /app/apps/api # Change ownership to nodejs user @@ -85,4 +85,5 @@ USER nodejs EXPOSE 8080 # NODE_ENV will be set via Cloud Run environment variables +# Start the application CMD ["pnpm", "start"] \ No newline at end of file