# syntax=docker/dockerfile:1 # # Server-only image (this repo has no Flutter client). The web client is # built in the KC-APP client repo and its `build/web` output is mounted # into the container at runtime via WEB_CLIENT_DIR (see docker-compose.yml). # --- 1. Backend build --------------------------------------------------------- FROM node:20-bookworm-slim AS api-build WORKDIR /src # Prisma detects the OpenSSL version at `generate` time to pick the matching # query engine binary; without OpenSSL present here it silently defaults to # openssl-1.1.x, which then fails to load in the runtime stage (openssl 3.0.x). RUN apt-get update && apt-get install -y --no-install-recommends openssl \ && rm -rf /var/lib/apt/lists/* COPY package.json package-lock.json ./ RUN npm ci COPY . . RUN npx prisma generate && npm run build # --- 2. Runtime ------------------------------------------------------------- FROM node:20-bookworm-slim AS runtime ENV NODE_ENV=production WORKDIR /app # Prisma needs OpenSSL at runtime. RUN apt-get update && apt-get install -y --no-install-recommends openssl \ && rm -rf /var/lib/apt/lists/* COPY --from=api-build /src/node_modules ./node_modules COPY --from=api-build /src/dist ./dist COPY --from=api-build /src/prisma ./prisma # Web client bundle is bind-mounted at runtime, not baked into the image; # app.module reads WEB_CLIENT_DIR. See docker-compose.yml. EXPOSE 3000 # Apply pending migrations, then boot. CMD ["sh", "-c", "npx prisma migrate deploy && node dist/main.js"]