Files
crawle-snapp/Dockerfile
T
nfel 776de685d0 Install uv via curl instead of pip in builder stage
pip install uv tries to fetch from PyPI which is unreachable from
our VPS. Using curl installer directly avoids any PyPI dependency.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-08-04 22:48:06 +03:30

95 lines
3.4 KiB
Docker

# Usage:
# make build # Build all Docker images (admin + worker)
# docker compose up -d # Start all services
#
# - admin stage: python:3.11-slim (FastAPI only, no Chrome)
# - worker stage: Playwright Noble with Python + Chromium pre-installed
# from your local registry mirror.
# ── Build args ─────────────────────────────────────────────────────────────────
ARG BASE_IMAGE=python:3.11-slim
# ── Stage 1: dependency resolver ─────────────────────────────────────────────
FROM python:3.11-slim AS builder
# Install uv via curl (not pip) to avoid any PyPI/network dependency
RUN curl -LsSf https://astral.sh/uv/install.sh | \
UV_INSTALL_DIR=/usr/local sh
WORKDIR /app
ENV UV_INDEX_URL="http://pypi.reg.darano.ir/simple/"
COPY pyproject.toml uv.lock* ./
RUN /usr/local/uv/bin/uv sync --frozen --no-dev --no-install-project
# ── Stage 2a: admin runtime (python:3.11-slim, no Chrome needed) ──────────────
FROM ${BASE_IMAGE} AS admin
WORKDIR /app
ENV PATH="/app/.venv/bin:$PATH" \
PYTHONUNBUFFERED=1 \
PYTHONDONTWRITEBYTECODE=1 \
UV_INDEX_URL="http://pypi.reg.darano.ir/simple/"
COPY . .
COPY --from=builder /app/.venv /app/.venv
RUN mkdir -p data logs recordings \
&& useradd -m -u 1001 seed \
&& chown -R seed:seed /app
USER seed
EXPOSE 8000
CMD ["python", "main.py", "admin"]
# ── Stage 2b: worker runtime (Playwright Noble + Python installed) ─────────────
# Base: oci.reg.darano.ir/mcr.microsoft.com/playwright:v1.62.0-noble
# This image ships: Ubuntu 24.04 + Chromium + Firefox + WebKit + system libs.
# We add Python + uv ourselves.
FROM oci.reg.darano.ir/mcr.microsoft.com/playwright:v1.62.0-noble AS worker
# Install Python 3.12 + uv, then sync deps — all in one RUN so PATH is consistent.
# Use a mirror for apt since the VPS has network restrictions (Iran).
# curl is already installed (playwright system dep).
RUN printf 'Types: deb\nURIs: http://repo.iut.ac.ir/ubuntu/\nSuites: noble noble-updates noble-security\nComponents: main restricted universe multiverse\nSigned-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg\n' \
> /etc/apt/sources.list.d/ubuntu.sources \
&& apt-get update && apt-get install -y --no-install-recommends \
python3 python3-venv \
&& rm -rf /var/lib/apt/lists/* \
&& curl -LsSf https://astral.sh/uv/install.sh | \
UV_INSTALL_DIR=/usr/local sh \
&& /usr/local/uv/bin/uv sync --frozen --no-dev --no-install-project
ENV PATH="/app/.venv/bin:$PATH" \
PYTHONUNBUFFERED=1 \
PYTHONDONTWRITEBYTECODE=1 \
UV_INDEX_URL="http://pypi.reg.darano.ir/simple/" \
# Chromium is pre-installed at /usr/bin/chromium
CHROME_BINARY=/usr/bin/chromium \
CHROMEDRIVER_PATH=/usr/bin/chromedriver \
HEADLESS=true
WORKDIR /app
# Copy manifests first (stable cache layer)
COPY pyproject.toml uv.lock* ./
# Copy app code
COPY . .
# mkdir for volumes, user for security
RUN mkdir -p data logs recordings \
&& useradd -m -u 1001 seed 2>/dev/null || true \
&& chown -R seed:seed /app 2>/dev/null || true
USER seed
# CMD overridden in docker-compose.yml to use RQ worker
CMD ["rq", "worker", "--url", "redis://redis:6379/0", "batch"]