Files
CapaKraken/Dockerfile.prod
T
Hartmut bb117e9179
CI / Architecture Guardrails (push) Successful in 3m12s
CI / Assistant Split Regression (push) Successful in 4m6s
CI / Typecheck (push) Successful in 4m36s
CI / Lint (push) Successful in 4m33s
CI / Unit Tests (push) Successful in 6m40s
CI / Build (push) Successful in 6m53s
CI / Fresh-Linux Docker Deploy (push) Failing after 1m42s
CI / E2E Tests (push) Successful in 4m11s
CI / Release Images (push) Has been skipped
fix(docker): provide build-time auth/db env to next build
next build collects page data for /api/auth/[...nextauth] and aborts
when NEXTAUTH_URL/SECRET/DATABASE_URL are unset. The CI Build job
sets these as env vars; Dockerfile.prod did not, so the prod image
build failed during Release Images even though plain build worked.

Add ARG defaults that mirror the CI placeholders. Real values are
injected at container start, so build-time placeholders are inert.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-13 08:54:18 +02:00

105 lines
3.5 KiB
Docker

# ============================================================
# Stage 1: Install dependencies
# ============================================================
FROM node:20-bookworm-slim AS deps
RUN apt-get update -y && apt-get install -y openssl && rm -rf /var/lib/apt/lists/*
RUN npm install -g pnpm@9.14.2
WORKDIR /app
# Copy workspace manifests first for better layer caching
COPY package.json pnpm-workspace.yaml pnpm-lock.yaml ./
COPY tooling/ ./tooling/
COPY packages/shared/package.json ./packages/shared/
COPY packages/db/package.json ./packages/db/
COPY packages/engine/package.json ./packages/engine/
COPY packages/staffing/package.json ./packages/staffing/
COPY packages/application/package.json ./packages/application/
COPY packages/api/package.json ./packages/api/
COPY packages/ui/package.json ./packages/ui/
COPY apps/web/package.json ./apps/web/
RUN pnpm install --frozen-lockfile
# ============================================================
# Stage 2: Build the application
# ============================================================
FROM node:20-bookworm-slim AS builder
RUN apt-get update -y && apt-get install -y openssl && rm -rf /var/lib/apt/lists/*
RUN npm install -g pnpm@9.14.2
WORKDIR /app
# Copy installed dependencies from stage 1
COPY --from=deps /app/ ./
# Copy all source code
COPY . .
# Generate Prisma client
RUN pnpm --filter @capakraken/db db:generate
# Build the Next.js application
ENV NEXT_TELEMETRY_DISABLED=1
ENV NODE_ENV=production
# next build collects page data for /api/auth/[...nextauth] which crashes
# without these envs even though they are placeholders at image-build time
# (real values are injected at container start). Mirrors the CI build job.
ARG NEXTAUTH_URL=http://localhost:3100
ARG AUTH_URL=http://localhost:3100
ARG NEXTAUTH_SECRET=ci-build-placeholder-secret-minimum-32-chars
ARG AUTH_SECRET=ci-build-placeholder-secret-minimum-32-chars
ARG DATABASE_URL=postgresql://placeholder:placeholder@localhost:5432/placeholder
ARG REDIS_URL=redis://placeholder:6379
ENV NEXTAUTH_URL=$NEXTAUTH_URL
ENV AUTH_URL=$AUTH_URL
ENV NEXTAUTH_SECRET=$NEXTAUTH_SECRET
ENV AUTH_SECRET=$AUTH_SECRET
ENV DATABASE_URL=$DATABASE_URL
ENV REDIS_URL=$REDIS_URL
RUN pnpm --filter @capakraken/web build
# ============================================================
# Stage 3: Migration runner
# ============================================================
FROM builder AS migrator
ENV NODE_ENV=production
CMD ["pnpm", "--filter", "@capakraken/db", "db:migrate:deploy"]
# ============================================================
# Stage 4: Production runtime
# ============================================================
FROM node:20-bookworm-slim AS runner
RUN apt-get update -y && apt-get install -y openssl curl && rm -rf /var/lib/apt/lists/*
WORKDIR /app
ENV NODE_ENV=production
ENV NEXT_TELEMETRY_DISABLED=1
ENV HOSTNAME=0.0.0.0
ENV PORT=3000
RUN addgroup --system --gid 1001 nodejs && \
adduser --system --uid 1001 nextjs
# Copy the standalone output (includes server.js and node_modules)
COPY --from=builder --chown=nextjs:nodejs /app/apps/web/.next/standalone ./
# Copy static assets and public files
COPY --from=builder --chown=nextjs:nodejs /app/apps/web/.next/static ./apps/web/.next/static
COPY --from=builder --chown=nextjs:nodejs /app/apps/web/public ./apps/web/public
USER nextjs
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \
CMD curl -f http://localhost:3000/api/health || exit 1
CMD ["node", "apps/web/server.js"]