File size: 1,633 Bytes
e516f1f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a088a0e
e516f1f
a088a0e
 
 
 
 
e516f1f
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# Spooky FastAPI service — CPU-only image (no CUDA, no D-Wave cloud token
# required: DWave_solver.py uses dimod's SimulatedAnnealingSampler, a local
# classical solver). Suitable for HF Spaces' Docker SDK on the free CPU tier.
#
# GPU (lightning.gpu) and qiskit.remote solver profiles are still listed in
# fastapi_app/config/solvers.yaml but will fail at solve time in this image —
# use the qaoa_CPU_* profiles (lightning.qubit) instead.
FROM python:3.12-slim

ARG GIT_SHA=unknown
LABEL org.opencontainers.image.revision=$GIT_SHA

ENV PYTHONUNBUFFERED=1 \
    PYTHONDONTWRITEBYTECODE=1 \
    PIP_NO_CACHE_DIR=1

WORKDIR /app

# Copy only what the package build and the API need (see .dockerignore)
COPY pyproject.toml README.md ./
COPY quantum/ ./quantum/
COPY fastapi_app/ ./fastapi_app/

# Core install (numpy/h5py/pennylane/pyyaml) + fastapi extra + the
# lightweight extras the API actually imports at startup: dimod (classical
# D-Wave solver, no dwave-system/cloud client needed), plotly
# (quantum/visualizer.py, imported unconditionally by api.py), and
# pyomo/highspy (quantum/builder/ILPBuilder.py, imported unconditionally by
# quantum/builder/__init__.py — the ILP solver).
RUN pip install -e ".[fastapi, dwave, visualizer, classical]"

# Regenerating maps
RUN python quantum/maps/generate_all_maps.py

# HF Spaces runs containers as a non-root user; match that here.
RUN useradd -u 1000 -m spooky && chown -R spooky:spooky /app
USER spooky

WORKDIR /app/fastapi_app

# HF Spaces' Docker SDK expects the app on port 7860 by default.
EXPOSE 7860

CMD ["uvicorn", "api:app", "--host", "0.0.0.0", "--port", "7860"]