Spaces:
Running
Running
Upload Dockerfile with huggingface_hub
Browse files- Dockerfile +142 -0
Dockerfile
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# syntax=docker/dockerfile:1.4
|
| 2 |
+
|
| 3 |
+
# Pin verified Ollama artifacts; keep CUDA/Vulkan libraries out of the CPU Space.
|
| 4 |
+
FROM ollama/ollama:0.40.1@sha256:69f27594d8127cb43db1edcafa5e2d3cd8f88bdbc54a2cf3ceb11b8d138a24b1 AS ollama-source
|
| 5 |
+
|
| 6 |
+
FROM debian:bookworm-slim AS ollama-models
|
| 7 |
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
| 8 |
+
ca-certificates curl libstdc++6 libgomp1 \
|
| 9 |
+
&& rm -rf /var/lib/apt/lists/*
|
| 10 |
+
COPY --from=ollama-source /bin/ollama /bin/ollama
|
| 11 |
+
COPY --from=ollama-source /usr/lib/ollama/*.so* /usr/lib/ollama/
|
| 12 |
+
COPY --from=ollama-source /usr/lib/ollama/llama-server /usr/lib/ollama/llama-server
|
| 13 |
+
COPY --from=ollama-source /usr/lib/ollama/*LICENSE* /usr/lib/ollama/
|
| 14 |
+
ARG OLLAMA_EMBEDDING_MODEL=qwen3-embedding:0.6b
|
| 15 |
+
ARG OLLAMA_CHAT_MODEL=qwen3:0.6b
|
| 16 |
+
ENV OLLAMA_MODELS=/opt/ollama-models OLLAMA_NUM_PARALLEL=1 OLLAMA_MAX_LOADED_MODELS=1 OLLAMA_NO_CLOUD=true
|
| 17 |
+
COPY scripts/preload_ollama_models.sh /tmp/preload_ollama_models.sh
|
| 18 |
+
RUN OLLAMA_EMBEDDING_MODEL="$OLLAMA_EMBEDDING_MODEL" OLLAMA_CHAT_MODEL="$OLLAMA_CHAT_MODEL" \
|
| 19 |
+
bash /tmp/preload_ollama_models.sh
|
| 20 |
+
|
| 21 |
+
# ββ Stage 1: Console builder ββββββββββββββββββββββββββββββββ
|
| 22 |
+
FROM node:22.22.0-bookworm-slim AS console-builder
|
| 23 |
+
|
| 24 |
+
WORKDIR /console
|
| 25 |
+
COPY console/package.json console/package-lock.json ./
|
| 26 |
+
RUN npm ci
|
| 27 |
+
COPY console/ ./
|
| 28 |
+
RUN chmod +x node_modules/.bin/* 2>/dev/null || true
|
| 29 |
+
RUN npm run build
|
| 30 |
+
|
| 31 |
+
# ββ Stage 2: Python builder βββββββββββββββββββββββββββββββββ
|
| 32 |
+
FROM python:3.11.14-slim-bookworm AS builder
|
| 33 |
+
|
| 34 |
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
| 35 |
+
build-essential \
|
| 36 |
+
git \
|
| 37 |
+
postgresql-15 \
|
| 38 |
+
postgresql-server-dev-15 \
|
| 39 |
+
&& rm -rf /var/lib/apt/lists/*
|
| 40 |
+
|
| 41 |
+
ARG INSTALL_LOCAL_ML=false
|
| 42 |
+
|
| 43 |
+
ENV PYTHONUNBUFFERED=1 \
|
| 44 |
+
PYTHONDONTWRITEBYTECODE=1 \
|
| 45 |
+
PIP_NO_CACHE_DIR=1 \
|
| 46 |
+
PIP_RETRIES=8 \
|
| 47 |
+
PIP_TIMEOUT=900 \
|
| 48 |
+
PIP_DEFAULT_TIMEOUT=900 \
|
| 49 |
+
POETRY_NO_INTERACTION=1 \
|
| 50 |
+
POETRY_VIRTUALENVS_IN_PROJECT=true \
|
| 51 |
+
HF_HOME=/app/.cache \
|
| 52 |
+
SENTENCE_TRANSFORMERS_HOME=/app/.cache \
|
| 53 |
+
TIKTOKEN_CACHE_DIR=/app/.cache/tiktoken
|
| 54 |
+
|
| 55 |
+
RUN pip install --no-cache-dir poetry==2.1.3
|
| 56 |
+
|
| 57 |
+
WORKDIR /app
|
| 58 |
+
|
| 59 |
+
RUN git clone --branch v0.5.1 https://github.com/pgvector/pgvector.git /tmp/pgvector \
|
| 60 |
+
&& cd /tmp/pgvector && make && make install
|
| 61 |
+
|
| 62 |
+
COPY pyproject.toml poetry.lock ./
|
| 63 |
+
|
| 64 |
+
RUN if [ "$INSTALL_LOCAL_ML" = "true" ]; then \
|
| 65 |
+
poetry sync --no-root --only main --with local-ml; \
|
| 66 |
+
else \
|
| 67 |
+
poetry sync --no-root --only main; \
|
| 68 |
+
fi \
|
| 69 |
+
&& mkdir -p "$TIKTOKEN_CACHE_DIR" \
|
| 70 |
+
&& /app/.venv/bin/python -c "import tiktoken; tiktoken.get_encoding('cl100k_base')" \
|
| 71 |
+
&& rm -rf /root/.cache /tmp/*
|
| 72 |
+
|
| 73 |
+
COPY src/ ./src/
|
| 74 |
+
COPY scripts/preload_docker_models.py ./scripts/
|
| 75 |
+
|
| 76 |
+
RUN if [ "$INSTALL_LOCAL_ML" = "true" ]; then \
|
| 77 |
+
/app/.venv/bin/python scripts/preload_docker_models.py; \
|
| 78 |
+
fi \
|
| 79 |
+
&& rm -rf /root/.cache /tmp/*
|
| 80 |
+
|
| 81 |
+
# ββ Stage 3: runtime ββββββββββββββββββββββββββββββββββββββββ
|
| 82 |
+
FROM python:3.11.14-slim-bookworm
|
| 83 |
+
|
| 84 |
+
ARG BUILD_DATE
|
| 85 |
+
ARG BUILD_SHA
|
| 86 |
+
|
| 87 |
+
LABEL build_date="${BUILD_DATE}" \
|
| 88 |
+
build_sha="${BUILD_SHA}"
|
| 89 |
+
|
| 90 |
+
ENV PYTHONUNBUFFERED=1 \
|
| 91 |
+
PYTHONDONTWRITEBYTECODE=1 \
|
| 92 |
+
PATH="/app/.venv/bin:$PATH" \
|
| 93 |
+
HF_HOME=/app/.cache \
|
| 94 |
+
SENTENCE_TRANSFORMERS_HOME=/app/.cache \
|
| 95 |
+
TIKTOKEN_CACHE_DIR=/app/.cache/tiktoken \
|
| 96 |
+
PIP_NO_CACHE_DIR=1 \
|
| 97 |
+
PIP_RETRIES=8 \
|
| 98 |
+
PIP_TIMEOUT=900 \
|
| 99 |
+
PIP_DEFAULT_TIMEOUT=900
|
| 100 |
+
|
| 101 |
+
RUN apt-get update && apt-get upgrade -y \
|
| 102 |
+
&& apt-get install -y --no-install-recommends \
|
| 103 |
+
curl \
|
| 104 |
+
util-linux \
|
| 105 |
+
postgresql-15 \
|
| 106 |
+
postgresql-contrib-15 \
|
| 107 |
+
redis-server \
|
| 108 |
+
nginx \
|
| 109 |
+
supervisor \
|
| 110 |
+
libgomp1 \
|
| 111 |
+
&& rm -rf /var/lib/apt/lists/* \
|
| 112 |
+
&& python -m pip uninstall -y setuptools wheel \
|
| 113 |
+
&& groupadd -r appuser && useradd -r -g appuser -m appuser
|
| 114 |
+
|
| 115 |
+
WORKDIR /app
|
| 116 |
+
|
| 117 |
+
COPY --from=builder /usr/lib/postgresql/15/lib/vector.so /usr/lib/postgresql/15/lib/
|
| 118 |
+
COPY --from=builder /usr/share/postgresql/15/extension/vector* /usr/share/postgresql/15/extension/
|
| 119 |
+
COPY --from=builder /app/.venv /app/.venv
|
| 120 |
+
COPY --from=builder /app/.cache /app/.cache
|
| 121 |
+
COPY --from=builder /app/src /app/src
|
| 122 |
+
COPY --from=builder /app/pyproject.toml /app/
|
| 123 |
+
COPY --from=ollama-models /bin/ollama /bin/ollama
|
| 124 |
+
COPY --from=ollama-models /usr/lib/ollama /usr/lib/ollama
|
| 125 |
+
COPY --from=ollama-models /opt/ollama-models /opt/ollama-models
|
| 126 |
+
COPY --from=console-builder /console/dist /app/console/dist
|
| 127 |
+
COPY deploy/ ./deploy/
|
| 128 |
+
COPY entrypoint.sh ./
|
| 129 |
+
COPY scripts/start_with_ollama.py ./scripts/start_with_ollama.py
|
| 130 |
+
|
| 131 |
+
RUN chmod +x /app/entrypoint.sh
|
| 132 |
+
|
| 133 |
+
RUN mkdir -p /app/plugins && chown appuser:appuser /app/plugins
|
| 134 |
+
VOLUME ["/app/plugins"]
|
| 135 |
+
|
| 136 |
+
EXPOSE 7860
|
| 137 |
+
|
| 138 |
+
HEALTHCHECK --interval=30s --timeout=30s --start-period=120s --retries=5 \
|
| 139 |
+
CMD curl -f http://127.0.0.1:7860/health || exit 1
|
| 140 |
+
|
| 141 |
+
USER root
|
| 142 |
+
ENTRYPOINT ["/app/entrypoint.sh"]
|