@@ -0,0 +1,56 @@ |
| | 1 | +# sway-gate — pre-built image for the sway-gate-docker pre-commit hook. |
| | 2 | +# |
| | 3 | +# Contains: |
| | 4 | +# - Python 3.11 + dlm-sway[hf,semsim] from PyPI (torch wheels baked in) |
| | 5 | +# - Pre-cached MiniLM weights at /opt/sentence-transformers/ so |
| | 6 | +# adapter_revert / cluster_kl don't cold-download on first gate run. |
| | 7 | +# |
| | 8 | +# The hook runs ``sway gate <spec>`` against a mounted working-tree. |
| | 9 | +# Image is built + pushed by .github/workflows/docker.yml on ``v*`` tags. |
| | 10 | + |
| | 11 | +FROM python:3.11-slim AS base |
| | 12 | + |
| | 13 | +# HF / transformers cache env — we pre-warm the MiniLM during build; |
| | 14 | +# point runtime at the same location so cache hits work. |
| | 15 | +ENV HF_HOME=/opt/hf-cache \ |
| | 16 | + SENTENCE_TRANSFORMERS_HOME=/opt/sentence-transformers \ |
| | 17 | + PIP_NO_CACHE_DIR=1 \ |
| | 18 | + PIP_DISABLE_PIP_VERSION_CHECK=1 \ |
| | 19 | + PYTHONDONTWRITEBYTECODE=1 \ |
| | 20 | + PYTHONUNBUFFERED=1 |
| | 21 | + |
| | 22 | +# Minimal system deps — git for pip VCS installs (unused on prod wheels |
| | 23 | +# but keeps dev-image debugging practical); curl for healthchecks. |
| | 24 | +RUN apt-get update \ |
| | 25 | + && apt-get install -y --no-install-recommends git curl ca-certificates \ |
| | 26 | + && rm -rf /var/lib/apt/lists/* |
| | 27 | + |
| | 28 | +# SWAY_VERSION is baked in at build time so the image layer reflects |
| | 29 | +# the exact wheel installed. docker.yml passes this from the git tag. |
| | 30 | +ARG SWAY_VERSION=0.1.0 |
| | 31 | + |
| | 32 | +# Install sway with hf (torch + transformers + peft + safetensors) and |
| | 33 | +# semsim (sentence-transformers + scikit-learn) extras. The semsim |
| | 34 | +# extra is ~80 MB MiniLM + sklearn; pre-installing here vs lazy- |
| | 35 | +# installing at gate time is the whole point of the docker image. |
| | 36 | +RUN pip install "dlm-sway[hf,semsim]==${SWAY_VERSION}" |
| | 37 | + |
| | 38 | +# Pre-fetch the MiniLM weights used by adapter_revert (A2) and |
| | 39 | +# cluster_kl (S16). Without this, the first gate on an adapter touching |
| | 40 | +# either probe pays ~80 MB of download latency. Cache path mirrors the |
| | 41 | +# SENTENCE_TRANSFORMERS_HOME env set above. |
| | 42 | +RUN python -c "from sentence_transformers import SentenceTransformer; \ |
| | 43 | + SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')" |
| | 44 | + |
| | 45 | +# A working directory pre-commit will bind-mount over at runtime. |
| | 46 | +WORKDIR /workspace |
| | 47 | + |
| | 48 | +# Sanity: sway --version should match SWAY_VERSION. Build fails |
| | 49 | +# loudly otherwise. |
| | 50 | +RUN sway --version |
| | 51 | + |
| | 52 | +# ENTRYPOINT keeps the image composable: ``docker run sway-gate <args>`` |
| | 53 | +# runs ``sway <args>``. The pre-commit hook's entry: line passes |
| | 54 | +# ``sway gate`` explicitly — ENTRYPOINT defers that choice to the caller. |
| | 55 | +ENTRYPOINT ["sway"] |
| | 56 | +CMD ["--help"] |