# === Stage 1: Install dependencies === FROM python:3.11-slim-bullseye AS builder WORKDIR /subgen # Runtime build tools only — git and ffmpeg not needed here RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ --mount=type=cache,target=/var/lib/apt,sharing=locked \ apt-get update && apt-get install -y --no-install-recommends \ tzdata # Torch — own layer so requirements.txt changes don't bust it RUN --mount=type=cache,target=/root/.cache/pip \ pip install --prefix=/install torch torchaudio \ --extra-index-url https://download.pytorch.org/whl/cpu # App dependencies — only rebuilds when requirements.txt changes COPY requirements.txt . RUN --mount=type=cache,target=/root/.cache/pip \ pip install --prefix=/install -r requirements.txt \ --extra-index-url https://download.pytorch.org/whl/cpu # === Stage 2: Minimal runtime image === FROM python:3.11-slim-bullseye AS runtime WORKDIR /subgen RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ --mount=type=cache,target=/var/lib/apt,sharing=locked \ apt-get update && apt-get install -y --no-install-recommends \ ffmpeg curl gosu tzdata \ && rm -rf /var/lib/apt/lists/* # Copy installed packages from builder COPY --from=builder /install /usr/local # App files last — changes here don't bust the layers above COPY launcher.py subgen.py language_code.py /subgen/ RUN mkdir -p /cache && chmod 777 /cache ENV XDG_CACHE_HOME=/cache \ HF_HOME=/cache/huggingface \ MPLCONFIGDIR=/cache/matplotlib \ PYTHONUNBUFFERED=1 COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] CMD ["python3", "launcher.py"]