|
1 | 1 | # ── base: shared setup ──────────────────────────────────────────────────────── |
2 | 2 | FROM python:3.13-slim AS base |
3 | 3 |
|
4 | | -ENV PYTHONDONTWRITEBYTECODE=1 \ |
5 | | - PYTHONUNBUFFERED=1 \ |
6 | | - PYTHONPATH=/app/src |
| 4 | +COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ |
7 | 5 |
|
8 | 6 | WORKDIR /app |
9 | 7 |
|
10 | | -RUN apt-get update \ |
11 | | - && apt-get install -y --no-install-recommends \ |
12 | | - build-essential \ |
13 | | - && rm -rf /var/lib/apt/lists/* |
| 8 | +ENV PYTHONDONTWRITEBYTECODE=1 \ |
| 9 | + PYTHONUNBUFFERED=1 \ |
| 10 | + PYTHONPATH=/app/src \ |
| 11 | + UV_COMPILE_BYTECODE=1 \ |
| 12 | + UV_LINK_MODE=copy \ |
| 13 | + UV_PYTHON_DOWNLOADS=0 |
| 14 | + |
| 15 | +COPY pyproject.toml uv.lock README.md ./ |
14 | 16 |
|
15 | | -RUN pip install poetry |
| 17 | +RUN uv sync --locked --no-install-project --group api --group dashboard |
16 | 18 |
|
17 | | -COPY pyproject.toml poetry.lock ./ |
18 | 19 | COPY src ./src |
19 | 20 |
|
| 21 | +RUN uv sync --locked --no-dev --group api --group dashboard |
| 22 | + |
20 | 23 | # ── api ──────────────────────────────────────────────────────────────────────── |
21 | | -FROM base AS api |
| 24 | +FROM python:3.13-slim AS api |
| 25 | +WORKDIR /app |
22 | 26 |
|
23 | | -RUN poetry install --only main,api --no-root |
| 27 | +RUN useradd -m appuser |
| 28 | +RUN chown -R appuser:appuser /app |
24 | 29 |
|
| 30 | +COPY --from=base --chown=appuser:appuser /app /app |
25 | 31 | COPY builds.db ./ |
26 | 32 |
|
27 | | -ENV API_HOST=localhost \ |
28 | | - API_PORT=8050 |
| 33 | +ENV PYTHONPATH=/app/.venv/bin:$PATH |
| 34 | +ENV PYTHONBUFFERED=1 |
| 35 | +ENV API_HOST=localhost |
| 36 | +ENV API_PORT=8050 |
29 | 37 |
|
30 | 38 | EXPOSE 8050 |
31 | 39 |
|
32 | | -CMD [ \ |
33 | | - "poetry", "run", \ |
34 | | - "python", "-m", "api.main" \ |
35 | | - ] |
| 40 | +# Start FastAPI using uvicorn from the project virtualenv. |
| 41 | +CMD ["/bin/sh", "-c", "exec /app/.venv/bin/uvicorn api.main:app --host 0.0.0.0 --port \"${API_PORT}\" --proxy-headers --forwarded-allow-ips='*'"] |
36 | 42 |
|
37 | 43 | # ── dashboard ────────────────────────────────────────────────────────────────── |
38 | | -FROM base AS dashboard |
| 44 | +FROM python:3.13-slim AS dashboard |
| 45 | +WORKDIR /app |
| 46 | + |
| 47 | +RUN useradd -m appuser |
| 48 | +RUN chown -R appuser:appuser /app |
39 | 49 |
|
40 | | -RUN poetry install --only main,dashboard --no-root |
| 50 | +COPY --from=base --chown=appuser:appuser /app /app |
41 | 51 |
|
42 | | -ENV API_HOST=localhost \ |
43 | | - API_PORT=8050 |
| 52 | +ENV PYTHONPATH=/app/.venv/bin:$PATH |
| 53 | +ENV PYTHONBUFFERED=1 |
| 54 | +ENV API_HOST=localhost |
| 55 | +ENV API_PORT=8050 |
44 | 56 |
|
45 | 57 | EXPOSE 8501 |
46 | 58 |
|
47 | | -CMD [ \ |
48 | | - "poetry", "run", \ |
49 | | - "streamlit", "run", "src/dashboard/dashboard.py", \ |
50 | | - "--server.address=0.0.0.0", \ |
51 | | - "--server.port=8501" \ |
| 59 | +CMD ["/bin/sh", "-c", \ |
| 60 | + "exec /app/.venv/bin/streamlit run src/dashboard/dashboard.py --server.address=0.0.0.0 --server.port=8501" \ |
52 | 61 | ] |
0 commit comments