Stage 1 (builder): install build deps and pre-download wheels Stage 2 (runtime): copy only installed packages + runtime deps, no build tools
47 lines
1.0 KiB
Docker
47 lines
1.0 KiB
Docker
# Stage 1: build dependencies
|
|
FROM python:3.11-slim AS builder
|
|
|
|
WORKDIR /app
|
|
|
|
# Install build dependencies
|
|
RUN apt-get update && apt-get install -y \
|
|
build-essential \
|
|
default-libmysqlclient-dev \
|
|
pkg-config \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
# Pre-download wheels to avoid recompiling bcrypt from source
|
|
RUN pip install --no-cache-dir --prefix=/install \
|
|
'bcrypt==4.0.1' \
|
|
'cffi>=2.0' \
|
|
'pycparser>=2.0'
|
|
|
|
# Install Python dependencies
|
|
COPY requirements.txt .
|
|
RUN pip install --no-cache-dir --prefix=/install -r requirements.txt
|
|
|
|
# Stage 2: slim runtime
|
|
FROM python:3.11-slim
|
|
|
|
WORKDIR /app
|
|
|
|
# Install runtime dependencies only (no build tools)
|
|
RUN apt-get update && apt-get install -y \
|
|
default-libmysqlclient-dev \
|
|
curl \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
# Copy installed packages from builder
|
|
COPY --from=builder /install /usr/local
|
|
|
|
# Copy application code
|
|
COPY app/ ./app/
|
|
COPY requirements.txt ./
|
|
|
|
# Make entrypoint
|
|
COPY entrypoint.sh .
|
|
RUN chmod +x entrypoint.sh
|
|
|
|
EXPOSE 8000
|
|
ENTRYPOINT ["./entrypoint.sh"]
|