fix: use multi-stage Docker build for backend compilation
Browse filesTypeScript is a devDependency, so npx tsc failed when installed
with --omit=dev. Now using a dedicated backend-build stage that
installs all deps, compiles TS, then only the dist/ output is
copied into the final production image.
Made-with: Cursor
- Dockerfile +16 -4
Dockerfile
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
|
|
| 1 |
FROM node:20-slim AS frontend-build
|
| 2 |
|
| 3 |
WORKDIR /app/frontend
|
|
@@ -6,6 +7,16 @@ RUN npm install
|
|
| 6 |
COPY frontend/ ./
|
| 7 |
RUN npm run build
|
| 8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 9 |
FROM node:20-slim
|
| 10 |
|
| 11 |
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
@@ -33,15 +44,16 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
| 33 |
&& rm -rf /var/lib/apt/lists/*
|
| 34 |
|
| 35 |
WORKDIR /app
|
|
|
|
|
|
|
| 36 |
COPY backend/package.json backend/package-lock.json* ./
|
| 37 |
RUN npm install --omit=dev
|
|
|
|
| 38 |
|
| 39 |
-
# Install Playwright Chromium
|
| 40 |
RUN npx playwright install chromium || echo "Playwright install skipped"
|
| 41 |
|
| 42 |
-
|
| 43 |
-
RUN npx tsc
|
| 44 |
-
|
| 45 |
COPY --from=frontend-build /app/frontend/dist ./frontend-dist
|
| 46 |
|
| 47 |
# Copy CSS source files for the HTML renderer
|
|
|
|
| 1 |
+
# --- Stage 1: Build frontend ---
|
| 2 |
FROM node:20-slim AS frontend-build
|
| 3 |
|
| 4 |
WORKDIR /app/frontend
|
|
|
|
| 7 |
COPY frontend/ ./
|
| 8 |
RUN npm run build
|
| 9 |
|
| 10 |
+
# --- Stage 2: Build backend ---
|
| 11 |
+
FROM node:20-slim AS backend-build
|
| 12 |
+
|
| 13 |
+
WORKDIR /app
|
| 14 |
+
COPY backend/package.json backend/package-lock.json* ./
|
| 15 |
+
RUN npm install
|
| 16 |
+
COPY backend/ ./
|
| 17 |
+
RUN npx tsc
|
| 18 |
+
|
| 19 |
+
# --- Stage 3: Production image ---
|
| 20 |
FROM node:20-slim
|
| 21 |
|
| 22 |
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
|
|
| 44 |
&& rm -rf /var/lib/apt/lists/*
|
| 45 |
|
| 46 |
WORKDIR /app
|
| 47 |
+
|
| 48 |
+
# Copy compiled backend + prod dependencies
|
| 49 |
COPY backend/package.json backend/package-lock.json* ./
|
| 50 |
RUN npm install --omit=dev
|
| 51 |
+
COPY --from=backend-build /app/dist ./dist
|
| 52 |
|
| 53 |
+
# Install Playwright Chromium
|
| 54 |
RUN npx playwright install chromium || echo "Playwright install skipped"
|
| 55 |
|
| 56 |
+
# Copy frontend build
|
|
|
|
|
|
|
| 57 |
COPY --from=frontend-build /app/frontend/dist ./frontend-dist
|
| 58 |
|
| 59 |
# Copy CSS source files for the HTML renderer
|