trenchlesspm / Dockerfile
hirokamitai's picture
Redirect ~/.cache to the bucket so datalab models persist
9f4344b
Raw
History Blame Contribute Delete
2.74 kB
# CUDA + cuDNN + Python base. Matches A10 (Ampere) on HF Spaces.
FROM nvidia/cuda:12.4.1-cudnn-runtime-ubuntu22.04
ENV DEBIAN_FRONTEND=noninteractive \
PYTHONUNBUFFERED=1 \
PYTHONDONTWRITEBYTECODE=1 \
PIP_NO_CACHE_DIR=1 \
PIP_DISABLE_PIP_VERSION_CHECK=1
# System deps marker-pdf needs at runtime: poppler for PDF rendering, plus the
# usual fonts so rasterized output looks right. ca-certs for outbound HTTPS.
RUN apt-get update && apt-get install -y --no-install-recommends \
python3.11 python3.11-venv python3-pip \
git \
poppler-utils \
libgl1 libglib2.0-0 \
fonts-liberation fonts-dejavu-core \
ca-certificates \
curl \
&& rm -rf /var/lib/apt/lists/*
RUN ln -sf /usr/bin/python3.11 /usr/local/bin/python && \
ln -sf /usr/bin/python3.11 /usr/local/bin/python3
# HF Spaces runs containers as a non-root user (UID 1000) by default. Create
# matching user so files we write at runtime have sane ownership.
RUN useradd -m -u 1000 -s /bin/bash app
# Pin every cache marker touches to /data (HF Bucket mount). Without this,
# cold starts re-download multiple GB of weights even though the bucket is
# attached:
# HF_HOME / HF_HUB_CACHE / TRANSFORMERS_CACHE β€” HuggingFace Hub model cache.
# TORCH_HOME β€” Torch hub checkpoints.
# XDG_CACHE_HOME β€” catches anything that writes to `~/.cache/...` (e.g.
# datalab's text-detection + OCR-error-detection models, which marker
# pulls separately from the Hub).
# DATALAB_CACHE_DIR β€” explicit datalab override, belt-and-suspenders.
ENV HF_HOME=/data/hf \
HF_HUB_CACHE=/data/hf/hub \
TRANSFORMERS_CACHE=/data/hf/transformers \
TORCH_HOME=/data/torch \
XDG_CACHE_HOME=/data/cache \
DATALAB_CACHE_DIR=/data/datalab \
PORT=7860
WORKDIR /app
COPY --chown=app:app requirements.txt /app/requirements.txt
RUN pip install --upgrade pip && pip install -r /app/requirements.txt
# marker-pdf calls download_font() during PdfConverter init, which writes to
# `<site-packages>/static/fonts/`. That dir doesn't exist yet and the app user
# can't create it under root-owned site-packages. Pre-create + chown so marker
# can populate it on first parse.
#
# Use `pip show` to derive the install location β€” robust against the python3
# / python3.10 / python3.11 split on this image (apt installs 3.11 but pip
# is bound to 3.10 where marker actually lives).
RUN STATIC_DIR="$(pip show marker-pdf | awk -F': ' '/^Location:/ {print $2 "/static"}')" \
&& mkdir -p "$STATIC_DIR/fonts" \
&& chown -R app:app "$STATIC_DIR"
COPY --chown=app:app app /app/app
USER app
EXPOSE 7860
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "7860", "--timeout-keep-alive", "1800"]