xtablo-source/apps/api/Dockerfile

71 lines
2.4 KiB
Text
Raw Normal View History

2025-07-13 16:42:15 +00:00
# ==============================================================================
# Base stage - Common dependencies and setup
# ==============================================================================
2025-11-13 20:59:53 +00:00
# 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 .
2025-11-14 22:10:04 +00:00
FROM node:20-slim AS base
2025-07-13 16:42:15 +00:00
2025-11-14 22:10:04 +00:00
# Configure pnpm
ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"
RUN corepack enable
2025-07-13 16:42:15 +00:00
2025-11-14 22:10:04 +00:00
# Copy all files to working directory
COPY . /app
2025-07-13 16:42:15 +00:00
WORKDIR /app
# ==============================================================================
2025-11-14 22:10:04 +00:00
# Production dependencies stage - Install only production dependencies
2025-07-13 16:42:15 +00:00
# ==============================================================================
2025-11-14 22:10:04 +00:00
FROM base AS prod-deps
RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --prod --frozen-lockfile
2025-07-13 16:42:15 +00:00
# ==============================================================================
2025-11-14 22:10:04 +00:00
# Build stage - Install all dependencies and build
2025-07-13 16:42:15 +00:00
# ==============================================================================
2025-11-14 22:10:04 +00:00
FROM base AS build
RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile
# Build only the API and its dependencies
2025-11-13 20:59:53 +00:00
WORKDIR /app/apps/api
RUN pnpm run build
2025-07-13 16:42:15 +00:00
# ==============================================================================
2025-11-14 22:10:04 +00:00
# Final stage - Production image
2025-07-13 16:42:15 +00:00
# ==============================================================================
2025-11-14 22:10:04 +00:00
FROM node:20-slim
2025-07-13 16:42:15 +00:00
2025-11-14 22:10:04 +00:00
# Configure pnpm
ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"
RUN corepack enable
2025-07-13 16:42:15 +00:00
2025-11-14 22:10:04 +00:00
# Create non-root user
RUN groupadd --gid 1001 nodejs && \
useradd -l --uid 1001 --gid nodejs --shell /bin/bash --create-home nodejs
2025-07-13 16:42:15 +00:00
2025-11-14 22:10:04 +00:00
# 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
2025-07-13 16:42:15 +00:00
2025-11-14 22:10:04 +00:00
# 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
2025-11-13 21:29:47 +00:00
2025-11-14 22:10:04 +00:00
# Copy workspace files for proper resolution
COPY --from=build /app/pnpm-workspace.yaml /app/pnpm-workspace.yaml
COPY --from=build /app/package.json /app/package.json
2025-11-13 21:29:47 +00:00
2025-11-14 22:10:04 +00:00
# Set working directory
2025-11-13 20:59:53 +00:00
WORKDIR /app/apps/api
2025-07-13 16:42:15 +00:00
# Change ownership to nodejs user
RUN chown -R nodejs:nodejs /app
# Switch to non-root user
USER nodejs
# Expose port
EXPOSE 8080
2025-11-14 08:15:40 +00:00
# NODE_ENV will be set via Cloud Run environment variables
2025-11-13 20:59:53 +00:00
CMD ["pnpm", "start"]