From 4bb3c101a81aa01ceec6e2aa6bff1b63eba46f74 Mon Sep 17 00:00:00 2001 From: Admire <64821731+LittleChenLiya@users.noreply.github.com> Date: Mon, 30 Mar 2026 20:16:44 +0800 Subject: [PATCH] chore(uv): speed up Docker builds with mirrors (#1600) * docker mirror defaults * fix: make docker mirror defaults overridable * fix docker compose default pypi index * fix: restore upstream pypi defaults * docs: remove misleading env example mirrors --------- Co-authored-by: Willem Jiang --- CONTRIBUTING.md | 7 +++++++ README.md | 2 ++ backend/Dockerfile | 3 ++- docker/docker-compose-dev.yaml | 2 ++ docker/docker-compose.yaml | 2 ++ frontend/Dockerfile | 1 + 6 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5e4a6d934..03486cd39 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -70,6 +70,13 @@ make docker-logs-frontend make docker-logs-gateway ``` +If Docker builds are slow in your network, you can override the default package registries before running `make docker-init` or `make docker-start`: + +```bash +export UV_INDEX_URL=https://pypi.org/simple +export NPM_REGISTRY=https://registry.npmjs.org +``` + #### Linux: Docker daemon permission denied If `make docker-init`, `make docker-start`, or `make docker-stop` fails on Linux with an error like below, your current user likely does not have permission to access the Docker daemon socket: diff --git a/README.md b/README.md index 3e6682c6f..317a43f29 100644 --- a/README.md +++ b/README.md @@ -217,6 +217,8 @@ make docker-start # Start services (auto-detects sandbox mode from config.yaml `make docker-start` starts `provisioner` only when `config.yaml` uses provisioner mode (`sandbox.use: deerflow.community.aio_sandbox:AioSandboxProvider` with `provisioner_url`). +Docker builds use the upstream `uv` registry by default. If you need faster mirrors in restricted networks, export `UV_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple` and `NPM_REGISTRY=https://registry.npmmirror.com` before running `make docker-init` or `make docker-start`. + Backend processes automatically pick up `config.yaml` changes on the next config access, so model metadata updates do not require a manual restart during development. > [!TIP] diff --git a/backend/Dockerfile b/backend/Dockerfile index f41983277..f4063d7ae 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -8,6 +8,7 @@ FROM python:3.12-slim-bookworm ARG NODE_MAJOR=22 ARG APT_MIRROR +ARG UV_INDEX_URL # Optionally override apt mirror for restricted networks (e.g. APT_MIRROR=mirrors.aliyun.com) RUN if [ -n "${APT_MIRROR}" ]; then \ @@ -42,7 +43,7 @@ COPY backend ./backend # Install dependencies with cache mount RUN --mount=type=cache,target=/root/.cache/uv \ - sh -c "cd backend && uv sync" + sh -c "cd backend && UV_INDEX_URL=${UV_INDEX_URL:-https://pypi.org/simple} uv sync" # Expose ports (gateway: 8001, langgraph: 2024) EXPOSE 8001 2024 diff --git a/docker/docker-compose-dev.yaml b/docker/docker-compose-dev.yaml index 672ef413f..8b7b7da5d 100644 --- a/docker/docker-compose-dev.yaml +++ b/docker/docker-compose-dev.yaml @@ -115,6 +115,7 @@ services: args: APT_MIRROR: ${APT_MIRROR:-} UV_IMAGE: ${UV_IMAGE:-ghcr.io/astral-sh/uv:0.7.20} + UV_INDEX_URL: ${UV_INDEX_URL:-https://pypi.org/simple} container_name: deer-flow-gateway command: sh -c "cd backend && uv sync && PYTHONPATH=. uv run uvicorn app.gateway.app:app --host 0.0.0.0 --port 8001 --reload --reload-include='*.yaml .env' > /app/logs/gateway.log 2>&1" volumes: @@ -169,6 +170,7 @@ services: args: APT_MIRROR: ${APT_MIRROR:-} UV_IMAGE: ${UV_IMAGE:-ghcr.io/astral-sh/uv:0.7.20} + UV_INDEX_URL: ${UV_INDEX_URL:-https://pypi.org/simple} container_name: deer-flow-langgraph command: sh -c "cd backend && uv sync && uv run langgraph dev --no-browser --allow-blocking --host 0.0.0.0 --port 2024 --n-jobs-per-worker 10 > /app/logs/langgraph.log 2>&1" volumes: diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml index 720c2f915..dea4c98e0 100644 --- a/docker/docker-compose.yaml +++ b/docker/docker-compose.yaml @@ -64,6 +64,7 @@ services: args: APT_MIRROR: ${APT_MIRROR:-} UV_IMAGE: ${UV_IMAGE:-ghcr.io/astral-sh/uv:0.7.20} + UV_INDEX_URL: ${UV_INDEX_URL:-https://pypi.org/simple} container_name: deer-flow-gateway command: sh -c "cd backend && PYTHONPATH=. uv run uvicorn app.gateway.app:app --host 0.0.0.0 --port 8001 --workers 2" volumes: @@ -114,6 +115,7 @@ services: args: APT_MIRROR: ${APT_MIRROR:-} UV_IMAGE: ${UV_IMAGE:-ghcr.io/astral-sh/uv:0.7.20} + UV_INDEX_URL: ${UV_INDEX_URL:-https://pypi.org/simple} container_name: deer-flow-langgraph command: sh -c "cd /app/backend && uv run langgraph dev --no-browser --allow-blocking --no-reload --host 0.0.0.0 --port 2024 --n-jobs-per-worker 10" volumes: diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 9f37b4ec3..2fd06aea3 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -4,6 +4,7 @@ # --target prod — full build baked in, run `pnpm start` at container start (default if no --target is specified) ARG PNPM_STORE_PATH=/root/.local/share/pnpm/store +ARG NPM_REGISTRY # ── Base: shared setup ──────────────────────────────────────────────────────── FROM node:22-alpine AS base