|
1 | | -# Build stage |
| 1 | +# Build stage — SAM3 support is opt-in to keep default image size small |
2 | 2 | FROM python:3.12-slim as builder |
3 | 3 |
|
4 | 4 | WORKDIR /app |
5 | 5 |
|
6 | | -# Install build dependencies |
| 6 | +ARG INSTALL_SAM3=false |
| 7 | + |
7 | 8 | RUN apt-get update && apt-get install -y --no-install-recommends \ |
8 | 9 | libpq-dev gcc \ |
9 | 10 | && rm -rf /var/lib/apt/lists/* |
10 | 11 |
|
11 | | -# Install Python dependencies |
12 | 12 | COPY requirements.txt requirements-sam3.txt ./ |
13 | 13 | RUN pip install --no-cache-dir --prefix=/install -r requirements.txt \ |
14 | | - && python -m venv /sam3-venv \ |
15 | | - && /sam3-venv/bin/pip install --no-cache-dir -r requirements-sam3.txt |
| 14 | + && mkdir -p /sam3-venv \ |
| 15 | + && if [ "$INSTALL_SAM3" = "true" ]; then \ |
| 16 | + python -m venv /sam3-venv \ |
| 17 | + && /sam3-venv/bin/pip install --no-cache-dir -r requirements-sam3.txt; \ |
| 18 | + fi |
16 | 19 |
|
17 | 20 | # Production stage |
18 | 21 | FROM python:3.12-slim |
19 | 22 |
|
20 | 23 | WORKDIR /app |
21 | 24 |
|
22 | | -# Install runtime dependencies only |
| 25 | +ARG INSTALL_SAM3=false |
| 26 | + |
23 | 27 | RUN apt-get update && apt-get install -y --no-install-recommends \ |
24 | 28 | libpq5 ffmpeg \ |
25 | 29 | && rm -rf /var/lib/apt/lists/* |
26 | 30 |
|
27 | | -# Copy decord stub (decord is Linux-only, not needed by LocateAnything-3B) |
28 | 31 | COPY decord_stub.py /usr/local/lib/python3.12/site-packages/decord.py |
29 | 32 |
|
30 | | -# Copy Python packages from builder |
31 | 33 | COPY --from=builder /install /usr/local |
32 | | -# Copy SAM3 venv |
33 | 34 | COPY --from=builder /sam3-venv /app/sam3-venv |
34 | 35 |
|
35 | | -# Create non-root user and data directories |
36 | 36 | RUN useradd -m -u 1000 appuser \ |
37 | 37 | && mkdir -p /app/uploads /app/model /app/training_runs \ |
38 | 38 | && chown -R appuser:appuser /app |
39 | 39 | USER appuser |
40 | 40 |
|
41 | | -# Copy application code |
42 | 41 | COPY --chown=appuser:appuser app ./app |
43 | 42 | COPY --chown=appuser:appuser sam3_server.py . |
44 | 43 | COPY --chown=appuser:appuser alembic.ini . |
45 | 44 | COPY --chown=appuser:appuser alembic ./alembic |
46 | 45 |
|
47 | | -# Set environment variables |
48 | 46 | ENV PYTHONPATH=/app \ |
49 | 47 | PYTHONUNBUFFERED=1 \ |
50 | 48 | PYTHONDONTWRITEBYTECODE=1 |
51 | 49 |
|
52 | 50 | EXPOSE 8000 8002 |
53 | 51 |
|
54 | | -# Health check |
55 | 52 | HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ |
56 | 53 | CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/api/health')" |
57 | 54 |
|
|
0 commit comments