Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion workers/extract-worker/.dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@
!README.md
!uv.dist.lock
!uv.lock
!io-worker-deps-exclusion.txt
!io-worker-deps-exclusion.txt
83 changes: 40 additions & 43 deletions workers/extract-worker/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,32 +1,15 @@
FROM python:3.14-slim-trixie AS extract-worker-builder
# Slim runtime base: debian + uv + the uv-managed interpreter, but not build toolchain.
# The venv built in the *-build stages references the managed interpreter using absolute
# path (see .venv/bin/python -> /root/.local/share/uv/python/...), so we copy it here at
# the same location. Workers are build by copying their /app (venv + code) on top.
FROM debian:trixie-slim AS runtime-base

ENV PYTHONUNBUFFERED=1
ENV UV_HTTP_TIMEOUT=300
ENV UV_LINK_MODE=copy
ENV UV_COMPILE_BYTECODE=1
ENV UV_NO_DEV=1

COPY --from=ghcr.io/astral-sh/uv:0.11.24 /uv /uvx /bin/

WORKDIR /app

FROM debian:trixie-slim AS extract-worker-builder-free-threaded

ENV PYTHONUNBUFFERED=1
ENV UV_HTTP_TIMEOUT=300
ENV UV_LINK_MODE=copy
ENV UV_COMPILE_BYTECODE=1
ENV UV_NO_DEV=1
ENV PYTHON_GIL=0

RUN apt update
RUN apt install -y git-all \
libprotobuf-dev \
protobuf-compiler \
zlib1g-dev

COPY --from=ghcr.io/astral-sh/uv:0.11.24 /uv /uvx /bin/
RUN uv python install 3.14t

WORKDIR /app

Expand All @@ -37,10 +20,10 @@ FROM nvidia/cuda:12.9.0-devel-ubuntu24.04 AS flash-attn-builder

COPY --from=ghcr.io/astral-sh/uv:0.11.6 /uv /bin/

RUN uv python install 3.14t
RUN uv python install 3.14

# Install torch from the lockfile by install extras and skipping some packages
RUN --mount=type=cache,target=~/.cache/uv \
RUN --mount=type=cache,target=/root/.cache/uv \
--mount=type=bind,source=uv.dist.lock,target=uv.lock \
--mount=type=bind,source=pyproject.toml,target=pyproject.toml \
uv sync --frozen --no-install-project --no-editable --extra base --extra gpu \
Expand All @@ -53,16 +36,16 @@ RUN --mount=type=bind,source=uv.dist.lock,target=uv.lock \
uv export --frozen --extra base-gpu --no-dev | \
sed -n 's/^flash-attn==\([^; ]*\).*/\1/p' > flash-attn-version.txt

RUN --mount=type=cache,target=~/.cache/uv \
RUN --mount=type=cache,target=/root/.cache/uv \
uv pip install pip && \
MAX_JOBS=8 uv run python -m pip wheel "flash-attn==$(cat flash-attn-version.txt)" \
--no-build-isolation --no-deps -w /flash-attn-wheel


FROM extract-worker-builder AS io-worker
FROM runtime-base AS io-worker
ADD io-worker-deps-exclusion.txt ./
# Install deps first to optimize layer cache
RUN --mount=type=cache,target=~/.cache/uv \
RUN --mount=type=cache,target=/root/.cache/uv \
--mount=type=bind,source=uv.dist.lock,target=uv.lock \
--mount=type=bind,source=pyproject.toml,target=pyproject.toml \
uv sync -v --frozen --no-editable --no-install-project $(sed 's/^/--no-install-package /' io-worker-deps-exclusion.txt)
Expand All @@ -74,23 +57,23 @@ ADD extract_worker ./extract_worker/
ADD entrypoints/io_worker.sh ./entrypoints/io_worker.sh

# Then install service
RUN --mount=type=cache,target=~/.cache/uv uv sync -v --frozen --no-editable $(sed 's/^/--no-install-package /' io-worker-deps-exclusion.txt)
RUN --mount=type=cache,target=/root/.cache/uv uv sync -v --frozen --no-editable $(sed 's/^/--no-install-package /' io-worker-deps-exclusion.txt)
RUN rm -rf ~/.cache/pip

ENTRYPOINT ["entrypoints/io_worker.sh"]


FROM extract-worker-builder AS extract-base-builder
FROM runtime-base AS extract-base-builder

RUN apt update && \
apt install -y --no-install-recommends build-essential g++ && \
apt install -y tesseract-ocr && \
rm -rf /var/lib/apt/lists/*


FROM extract-base-builder AS extract-cpu-worker
FROM extract-base-builder AS extract-cpu-build
# Install deps first to optimize layer cache
RUN --mount=type=cache,target=~/.cache/uv \
RUN --mount=type=cache,target=/root/.cache/uv \
--mount=type=bind,source=uv.dist.lock,target=uv.lock \
--mount=type=bind,source=pyproject.toml,target=pyproject.toml \
uv sync -v --frozen --no-editable --no-install-project --extra base --extra cpu
Expand All @@ -102,23 +85,30 @@ ADD extract_worker ./extract_worker/
ADD entrypoints/extract_cpu_worker.sh ./entrypoints/extract_cpu_worker.sh

# Then install service
RUN --mount=type=cache,target=~/.cache/uv uv sync -v --frozen --no-editable --extra base --extra cpu
RUN --mount=type=cache,target=/root/.cache/uv uv sync -v --frozen --no-editable --extra base --extra cpu
RUN rm -rf ~/.cache/pip

# Slim runtime: drop build-essential/g++ (only needed to build the venv), keep tesseract for OCR
FROM runtime-base AS extract-cpu-worker
RUN apt update && \
apt install -y --no-install-recommends tesseract-ocr && \
rm -rf /var/lib/apt/lists/*
COPY --from=extract-cpu-build /app /app

ENTRYPOINT ["entrypoints/extract_cpu_worker.sh"]


FROM extract-base-builder AS extract-gpu-worker
FROM extract-base-builder AS extract-gpu-build
## Copy the flash-attn wheel
#COPY --from=flash-attn-builder /flash-attn-wheel /flash-attn-wheel
## Install the wheel
#RUN uv pip install /flash-attn-wheel/*.whl --no-deps

# Install deps first to optimize layer cache
RUN --mount=type=cache,target=~/.cache/uv \
RUN --mount=type=cache,target=/root/.cache/uv \
--mount=type=bind,source=uv.dist.lock,target=uv.lock \
--mount=type=bind,source=pyproject.toml,target=pyproject.toml \
uv sync -v --frozen --no-editable --no-install-project --extra base --extra base --extra gpu #--no-install-package flash-attn
uv sync -v --frozen --no-editable --no-install-project --extra base --extra gpu

# Then copy code
ADD uv.dist.lock ./uv.lock
Expand All @@ -127,15 +117,22 @@ ADD extract_worker ./extract_worker/
ADD entrypoints/extract_gpu_worker.sh ./entrypoints/extract_gpu_worker.sh

# Then install service
RUN --mount=type=cache,target=~/.cache/uv uv sync -v --frozen --no-editable --extra base --extra gpu
RUN --mount=type=cache,target=/root/.cache/uv uv sync -v --frozen --no-editable --extra base --extra gpu
RUN rm -rf ~/.cache/pip

# Slim runtime (as extract-cpu-worker): no toolchain, keep tesseract
FROM runtime-base AS extract-gpu-worker
RUN apt update && \
apt install -y --no-install-recommends tesseract-ocr && \
rm -rf /var/lib/apt/lists/*
COPY --from=extract-gpu-build /app /app

ENTRYPOINT ["entrypoints/extract_gpu_worker.sh"]


FROM extract-worker-builder AS extract-cpu-mineru-worker
FROM runtime-base AS extract-cpu-mineru-worker
# Install deps first to optimize layer cache
RUN --mount=type=cache,target=~/.cache/uv \
RUN --mount=type=cache,target=/root/.cache/uv \
--mount=type=bind,source=uv.dist.lock,target=uv.lock \
--mount=type=bind,source=pyproject.toml,target=pyproject.toml \
uv sync -v --frozen --no-editable --no-install-project --extra mineru --extra cpu
Expand All @@ -147,18 +144,18 @@ ADD extract_worker ./extract_worker/
ADD entrypoints/extract_cpu_worker.sh ./entrypoints/extract_cpu_worker.sh

# Then install service
RUN --mount=type=cache,target=~/.cache/uv uv sync -v --frozen --no-editable --extra mineru --extra cpu
RUN --mount=type=cache,target=/root/.cache/uv uv sync -v --frozen --no-editable --extra mineru --extra cpu
RUN rm -rf ~/.cache/pip

ENTRYPOINT ["entrypoints/extract_cpu_worker.sh"]


FROM extract-worker-builder AS extract-gpu-mineru-worker
FROM runtime-base AS extract-gpu-mineru-worker
# Install deps first to optimize layer cache
RUN --mount=type=cache,target=~/.cache/uv \
RUN --mount=type=cache,target=/root/.cache/uv \
--mount=type=bind,source=uv.dist.lock,target=uv.lock \
--mount=type=bind,source=pyproject.toml,target=pyproject.toml \
uv sync -v --frozen --no-editable --no-install-project --extra mineru --extra mineru --extra gpu
uv sync -v --frozen --no-editable --no-install-project --extra mineru --extra gpu

# Then copy code
ADD uv.dist.lock ./uv.lock
Expand All @@ -167,7 +164,7 @@ ADD extract_worker ./extract_worker/
ADD entrypoints/extract_gpu_worker.sh ./entrypoints/extract_gpu_worker.sh

# Then install service
RUN --mount=type=cache,target=~/.cache/uv uv sync -v --frozen --no-editable --extra mineru --extra mineru --extra gpu
RUN --mount=type=cache,target=/root/.cache/uv uv sync -v --frozen --no-editable --extra mineru --extra gpu
RUN rm -rf ~/.cache/pip

ENTRYPOINT ["entrypoints/extract_gpu_worker.sh"]
5 changes: 5 additions & 0 deletions workers/extract-worker/base-worker-deps-exclusion.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
loguru
colorlog
httpx-retries
aiofiles
xlsxwriter
Loading