# syntax=docker/dockerfile:1 # ───────────────────────────────────────────────────────────────────────────── # Sanad Package 1 — Basic Communication. # BUILD CONTEXT MUST BE Packages/ (FROM the prebuilt sanad-base): # docker build -f Sanad_Package_1/Dockerfile -t sanad-p1:latest . # (the top-level Packages/docker-compose.yml sets context: . for this service.) # ───────────────────────────────────────────────────────────────────────────── ARG BASE_IMAGE=sanad-base:latest FROM ${BASE_IMAGE} # P1 (comms) extra system deps — PortAudio + a C toolchain so pyaudio's C # extension compiles on the slim base (python:3.10-slim has no compiler). RUN apt-get update && apt-get install -y --no-install-recommends \ portaudio19-dev libportaudio2 build-essential python3-dev \ && rm -rf /var/lib/apt/lists/* # P1 Python deps (sanad-base is python:3.10 → google-genai installs cleanly). COPY Sanad_Package_1/requirements-p1.txt /tmp/requirements-p1.txt RUN python3 -m pip install --no-cache-dir -r /tmp/requirements-p1.txt # P1 launcher + routes + entrypoint + config (Sanad source baked into sanad-base). COPY Sanad_Package_1/app_p1.py /app/app_p1.py COPY Sanad_Package_1/routes_p1.py /app/routes_p1.py COPY Sanad_Package_1/entrypoint.sh /app/entrypoint.sh COPY Sanad_Package_1/config /app/pkg1_config COPY Sanad_Package_1/static /app/pkg1_static RUN chmod +x /app/entrypoint.sh # Ship KEYLESS — strip any Gemini key baked into the Sanad config so the vendor # key never ships in the image; the customer adds their own via the dashboard. COPY Sanad_Package_1/strip_key.py /tmp/strip_key.py RUN python3 /tmp/strip_key.py && rm -f /tmp/strip_key.py ENV SANAD_PACKAGE=P1 \ SANAD_DASHBOARD_PORT=8011 \ SANAD_DASHBOARD_HOST=0.0.0.0 \ SANAD_P1_STATIC=/app/pkg1_static EXPOSE 8011 ENTRYPOINT ["/app/entrypoint.sh"]