# syntax=docker/dockerfile:1.6 # ============================================================================= # didibrain-scheduler — feeder + auditor + watcher in a single container. # # Imports brain_api.* directly (same Python package) so the auditor can use # DB pool + cache_judge + apply_judge_verdict without re-implementing them. # Build context is the didibrain/ project root (one level up). # # docker build -t didibrain-scheduler -f scheduler/Dockerfile . # ============================================================================= FROM python:3.12-slim-bookworm AS runtime ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ PYTHONIOENCODING=utf-8 \ PIP_NO_CACHE_DIR=1 \ PIP_DISABLE_PIP_VERSION_CHECK=1 \ PIP_ROOT_USER_ACTION=ignore WORKDIR /app RUN apt-get update \ && apt-get install -y --no-install-recommends curl \ && rm -rf /var/lib/apt/lists/* COPY scheduler/requirements.txt /tmp/requirements.txt RUN pip install --upgrade pip \ && pip install -r /tmp/requirements.txt \ && rm /tmp/requirements.txt # Brain modules (auditor imports them directly). COPY shared /app/shared COPY extractor /app/extractor COPY brain_api /app/brain_api COPY scheduler /app/scheduler RUN useradd --system --create-home --shell /bin/false brain \ && chown -R brain:brain /app USER brain # Healthcheck: main.py touches /tmp/scheduler.healthy every 30s. If the # file is older than 5 min, the container is considered unhealthy. HEALTHCHECK --interval=60s --timeout=10s --start-period=60s --retries=3 \ CMD test -f /tmp/scheduler.healthy && \ test "$(( $(date +%s) - $(stat -c %Y /tmp/scheduler.healthy) ))" -lt 300 \ || exit 1 CMD ["python", "-m", "scheduler.main"]