# ============================================================================= # Cloud Run Job image — va-worker # # Reuses the multi-stage base from Dockerfile. # Entrypoint: python -m app.tasks.runner --task --job-id # # Build: # docker build -f backend/Dockerfile.cloudrun -t va-worker backend/ # ============================================================================= # ── Stage 1: Builder ───────────────────────────────────────────────────────── FROM python:3.11-slim AS builder RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential curl \ && rm -rf /var/lib/apt/lists/* RUN pip install --no-cache-dir poetry==1.8.3 WORKDIR /app COPY pyproject.toml poetry.lock ./ RUN poetry config virtualenvs.create false \ && poetry install --no-interaction --no-ansi --only main # ── Stage 2: Runtime ───────────────────────────────────────────────────────── FROM python:3.11-slim AS runtime # ffmpeg required for video rendering tasks RUN apt-get update && apt-get install -y --no-install-recommends \ ffmpeg \ tini \ curl \ && rm -rf /var/lib/apt/lists/* # Copy installed packages from builder COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages COPY --from=builder /usr/local/bin /usr/local/bin WORKDIR /app COPY . . # Non-root user for security RUN groupadd -r worker && useradd -r -g worker worker \ && chown -R worker:worker /app USER worker # Cloud Run Jobs: no persistent HTTP port needed. # Cloud Run passes CLOUD_RUN_TASK_INDEX and CLOUD_RUN_TASK_COUNT env vars. ENV PYTHONUNBUFFERED=1 \ PYTHONDONTWRITEBYTECODE=1 \ PYTHONPATH=/app ENTRYPOINT ["tini", "--", "python", "-m", "app.tasks.runner"] # Args are injected per-execution via Cloud Run Job overrides: # --task ingest|translate|render|rerender --job-id [--language ] ...