|
1 | 1 | # ---- Frontend builder ---- |
2 | 2 | FROM node:20-slim AS frontend-builder |
3 | 3 | WORKDIR /frontend |
| 4 | + |
| 5 | +# Copy package files for dependency installation (using lockfile for reproducible builds) |
4 | 6 | COPY frontend/package*.json ./ |
5 | | -RUN npm install --legacy-peer-deps |
| 7 | +COPY frontend/package-lock.json ./ |
| 8 | + |
| 9 | +# Install frontend dependencies with lockfile |
| 10 | +RUN npm ci --legacy-peer-deps |
| 11 | + |
| 12 | +# Copy source code and build |
6 | 13 | COPY frontend/ . |
7 | 14 | RUN npm run build |
8 | 15 |
|
9 | | -# ---- Backend image ---- |
10 | | -FROM python:3.12-slim |
| 16 | +# Clean up npm cache to reduce layer size |
| 17 | +RUN npm cache clean --force && rm -rf /frontend/node_modules |
11 | 18 |
|
| 19 | +# ---- Backend dependencies installer ---- |
| 20 | +FROM python:3.12-slim AS backend-deps |
| 21 | + |
| 22 | +# Set environment variables |
12 | 23 | ENV PYTHONUNBUFFERED=1 \ |
13 | | - PIP_NO_CACHE_DIR=1 |
| 24 | + PIP_NO_CACHE_DIR=1 \ |
| 25 | + PIP_DISABLE_PIP_VERSION_CHECK=1 |
14 | 26 |
|
15 | 27 | WORKDIR /app |
16 | 28 |
|
| 29 | +# Install build dependencies for Python packages that need compilation |
17 | 30 | RUN apt-get update && apt-get install -y --no-install-recommends \ |
18 | 31 | build-essential \ |
19 | 32 | && rm -rf /var/lib/apt/lists/* |
20 | 33 |
|
| 34 | +# Copy requirements file and install Python dependencies |
21 | 35 | COPY requirements.txt . |
22 | 36 | RUN pip install --upgrade pip && pip install -r requirements.txt |
23 | 37 |
|
| 38 | +# Remove build dependencies after installing Python packages |
| 39 | +RUN apt-get remove -y build-essential && \ |
| 40 | + apt-get autoremove -y && \ |
| 41 | + apt-get clean && \ |
| 42 | + rm -rf /var/lib/apt/lists/* |
| 43 | + |
| 44 | +# ---- Production image ---- |
| 45 | +FROM python:3.12-slim |
| 46 | + |
| 47 | +# Set environment variables |
| 48 | +ENV PYTHONUNBUFFERED=1 \ |
| 49 | + PIP_NO_CACHE_DIR=1 \ |
| 50 | + PIP_DISABLE_PIP_VERSION_CHECK=1 |
| 51 | + |
| 52 | +WORKDIR /app |
| 53 | + |
| 54 | +# Copy installed Python dependencies from the backend-deps stage |
| 55 | +COPY --from=backend-deps /usr/local/lib/python3.12/site-packages /usr/local/lib/python3.12/site-packages |
| 56 | +COPY --from=backend-deps /usr/local/bin /usr/local/bin |
| 57 | + |
| 58 | +# Copy application code |
24 | 59 | COPY . . |
| 60 | + |
| 61 | +# Copy built frontend assets from builder stage |
25 | 62 | COPY --from=frontend-builder /frontend/dist ./frontend/dist |
26 | 63 |
|
27 | 64 | EXPOSE 8000 |
|
0 commit comments