mirror of
https://github.com/bytedance/deer-flow.git
synced 2026-04-25 11:18:22 +00:00
fix: add build-arg support for proxies and mirrors in Docker builds (#1346)
* fix: add build-arg support for proxies and mirrors in Docker builds (#1260) Pin Debian images to bookworm, make UV source image configurable, and pass APT_MIRROR/NPM_REGISTRY/UV_IMAGE through docker-compose. * fix: ensure build args use consistent defaults across compose and Dockerfiles UV_IMAGE: ${UV_IMAGE:-} resolved to empty when unset, overriding the Dockerfile ARG default and breaking `FROM ${UV_IMAGE}`. Also configure COREPACK_NPM_REGISTRY before pnpm download and propagate NPM_REGISTRY into the prod stage. * fix: dearmor NodeSource GPG key to resolve signing error Pipe the downloaded key through gpg --dearmor so apt can verify the repository signature (fixes NO_PUBKEY 2F59B5F99B1BE0B4). --------- Co-authored-by: JeffJiang <for-eleven@hotmail.com>
This commit is contained in:
parent
6b13f5c9fb
commit
8ae023574e
@ -1,7 +1,19 @@
|
|||||||
# Backend Development Dockerfile
|
# Backend Development Dockerfile
|
||||||
FROM python:3.12-slim
|
|
||||||
|
# UV source image (override for restricted networks that cannot reach ghcr.io)
|
||||||
|
ARG UV_IMAGE=ghcr.io/astral-sh/uv:0.7.20
|
||||||
|
FROM ${UV_IMAGE} AS uv-source
|
||||||
|
|
||||||
|
FROM python:3.12-slim-bookworm
|
||||||
|
|
||||||
ARG NODE_MAJOR=22
|
ARG NODE_MAJOR=22
|
||||||
|
ARG APT_MIRROR
|
||||||
|
|
||||||
|
# Optionally override apt mirror for restricted networks (e.g. APT_MIRROR=mirrors.aliyun.com)
|
||||||
|
RUN if [ -n "${APT_MIRROR}" ]; then \
|
||||||
|
sed -i "s|deb.debian.org|${APT_MIRROR}|g" /etc/apt/sources.list.d/debian.sources 2>/dev/null || true; \
|
||||||
|
sed -i "s|deb.debian.org|${APT_MIRROR}|g" /etc/apt/sources.list 2>/dev/null || true; \
|
||||||
|
fi
|
||||||
|
|
||||||
# Install system dependencies + Node.js (provides npx for MCP servers)
|
# Install system dependencies + Node.js (provides npx for MCP servers)
|
||||||
RUN apt-get update && apt-get install -y \
|
RUN apt-get update && apt-get install -y \
|
||||||
@ -10,7 +22,7 @@ RUN apt-get update && apt-get install -y \
|
|||||||
gnupg \
|
gnupg \
|
||||||
ca-certificates \
|
ca-certificates \
|
||||||
&& mkdir -p /etc/apt/keyrings \
|
&& mkdir -p /etc/apt/keyrings \
|
||||||
&& curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key -o /etc/apt/keyrings/nodesource.gpg \
|
&& curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \
|
||||||
&& echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_${NODE_MAJOR}.x nodistro main" > /etc/apt/sources.list.d/nodesource.list \
|
&& echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_${NODE_MAJOR}.x nodistro main" > /etc/apt/sources.list.d/nodesource.list \
|
||||||
&& apt-get update \
|
&& apt-get update \
|
||||||
&& apt-get install -y nodejs \
|
&& apt-get install -y nodejs \
|
||||||
@ -19,8 +31,8 @@ RUN apt-get update && apt-get install -y \
|
|||||||
# Install Docker CLI (for DooD: allows starting sandbox containers via host Docker socket)
|
# Install Docker CLI (for DooD: allows starting sandbox containers via host Docker socket)
|
||||||
COPY --from=docker:cli /usr/local/bin/docker /usr/local/bin/docker
|
COPY --from=docker:cli /usr/local/bin/docker /usr/local/bin/docker
|
||||||
|
|
||||||
# Install uv from a pinned versioned image (avoids curl|sh from untrusted remote)
|
# Install uv (source image overridable via UV_IMAGE build arg)
|
||||||
COPY --from=ghcr.io/astral-sh/uv:0.7.20 /uv /uvx /usr/local/bin/
|
COPY --from=uv-source /uv /uvx /usr/local/bin/
|
||||||
|
|
||||||
# Set working directory
|
# Set working directory
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|||||||
@ -24,6 +24,8 @@ services:
|
|||||||
build:
|
build:
|
||||||
context: ./provisioner
|
context: ./provisioner
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
|
args:
|
||||||
|
APT_MIRROR: ${APT_MIRROR:-}
|
||||||
container_name: deer-flow-provisioner
|
container_name: deer-flow-provisioner
|
||||||
volumes:
|
volumes:
|
||||||
- ~/.kube/config:/root/.kube/config:ro
|
- ~/.kube/config:/root/.kube/config:ro
|
||||||
@ -83,6 +85,7 @@ services:
|
|||||||
target: dev
|
target: dev
|
||||||
args:
|
args:
|
||||||
PNPM_STORE_PATH: ${PNPM_STORE_PATH:-/root/.local/share/pnpm/store}
|
PNPM_STORE_PATH: ${PNPM_STORE_PATH:-/root/.local/share/pnpm/store}
|
||||||
|
NPM_REGISTRY: ${NPM_REGISTRY:-}
|
||||||
container_name: deer-flow-frontend
|
container_name: deer-flow-frontend
|
||||||
command: sh -c "cd frontend && pnpm run dev > /app/logs/frontend.log 2>&1"
|
command: sh -c "cd frontend && pnpm run dev > /app/logs/frontend.log 2>&1"
|
||||||
volumes:
|
volumes:
|
||||||
@ -109,6 +112,9 @@ services:
|
|||||||
context: ../
|
context: ../
|
||||||
dockerfile: backend/Dockerfile
|
dockerfile: backend/Dockerfile
|
||||||
# cache_from disabled - requires manual setup: mkdir -p /tmp/docker-cache-gateway
|
# cache_from disabled - requires manual setup: mkdir -p /tmp/docker-cache-gateway
|
||||||
|
args:
|
||||||
|
APT_MIRROR: ${APT_MIRROR:-}
|
||||||
|
UV_IMAGE: ${UV_IMAGE:-ghcr.io/astral-sh/uv:0.7.20}
|
||||||
container_name: deer-flow-gateway
|
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 --reload --reload-include='*.yaml .env' > /app/logs/gateway.log 2>&1"
|
command: sh -c "cd backend && 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:
|
volumes:
|
||||||
@ -158,6 +164,9 @@ services:
|
|||||||
context: ../
|
context: ../
|
||||||
dockerfile: backend/Dockerfile
|
dockerfile: backend/Dockerfile
|
||||||
# cache_from disabled - requires manual setup: mkdir -p /tmp/docker-cache-langgraph
|
# cache_from disabled - requires manual setup: mkdir -p /tmp/docker-cache-langgraph
|
||||||
|
args:
|
||||||
|
APT_MIRROR: ${APT_MIRROR:-}
|
||||||
|
UV_IMAGE: ${UV_IMAGE:-ghcr.io/astral-sh/uv:0.7.20}
|
||||||
container_name: deer-flow-langgraph
|
container_name: deer-flow-langgraph
|
||||||
command: sh -c "cd backend && uv run langgraph dev --no-browser --allow-blocking --host 0.0.0.0 --port 2024 > /app/logs/langgraph.log 2>&1"
|
command: sh -c "cd backend && uv run langgraph dev --no-browser --allow-blocking --host 0.0.0.0 --port 2024 > /app/logs/langgraph.log 2>&1"
|
||||||
volumes:
|
volumes:
|
||||||
|
|||||||
@ -46,6 +46,7 @@ services:
|
|||||||
target: prod
|
target: prod
|
||||||
args:
|
args:
|
||||||
PNPM_STORE_PATH: ${PNPM_STORE_PATH:-/root/.local/share/pnpm/store}
|
PNPM_STORE_PATH: ${PNPM_STORE_PATH:-/root/.local/share/pnpm/store}
|
||||||
|
NPM_REGISTRY: ${NPM_REGISTRY:-}
|
||||||
container_name: deer-flow-frontend
|
container_name: deer-flow-frontend
|
||||||
environment:
|
environment:
|
||||||
- BETTER_AUTH_SECRET=${BETTER_AUTH_SECRET}
|
- BETTER_AUTH_SECRET=${BETTER_AUTH_SECRET}
|
||||||
@ -60,6 +61,9 @@ services:
|
|||||||
build:
|
build:
|
||||||
context: ../
|
context: ../
|
||||||
dockerfile: backend/Dockerfile
|
dockerfile: backend/Dockerfile
|
||||||
|
args:
|
||||||
|
APT_MIRROR: ${APT_MIRROR:-}
|
||||||
|
UV_IMAGE: ${UV_IMAGE:-ghcr.io/astral-sh/uv:0.7.20}
|
||||||
container_name: deer-flow-gateway
|
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"
|
command: sh -c "cd backend && PYTHONPATH=. uv run uvicorn app.gateway.app:app --host 0.0.0.0 --port 8001 --workers 2"
|
||||||
volumes:
|
volumes:
|
||||||
@ -105,6 +109,9 @@ services:
|
|||||||
build:
|
build:
|
||||||
context: ../
|
context: ../
|
||||||
dockerfile: backend/Dockerfile
|
dockerfile: backend/Dockerfile
|
||||||
|
args:
|
||||||
|
APT_MIRROR: ${APT_MIRROR:-}
|
||||||
|
UV_IMAGE: ${UV_IMAGE:-ghcr.io/astral-sh/uv:0.7.20}
|
||||||
container_name: deer-flow-langgraph
|
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"
|
command: sh -c "cd /app/backend && uv run langgraph dev --no-browser --allow-blocking --no-reload --host 0.0.0.0 --port 2024"
|
||||||
volumes:
|
volumes:
|
||||||
@ -154,6 +161,8 @@ services:
|
|||||||
build:
|
build:
|
||||||
context: ./provisioner
|
context: ./provisioner
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
|
args:
|
||||||
|
APT_MIRROR: ${APT_MIRROR:-}
|
||||||
container_name: deer-flow-provisioner
|
container_name: deer-flow-provisioner
|
||||||
volumes:
|
volumes:
|
||||||
- ~/.kube/config:/root/.kube/config:ro
|
- ~/.kube/config:/root/.kube/config:ro
|
||||||
|
|||||||
@ -1,4 +1,12 @@
|
|||||||
FROM python:3.12-slim
|
FROM python:3.12-slim-bookworm
|
||||||
|
|
||||||
|
ARG APT_MIRROR
|
||||||
|
|
||||||
|
# Optionally override apt mirror for restricted networks (e.g. APT_MIRROR=mirrors.aliyun.com)
|
||||||
|
RUN if [ -n "${APT_MIRROR}" ]; then \
|
||||||
|
sed -i "s|deb.debian.org|${APT_MIRROR}|g" /etc/apt/sources.list.d/debian.sources 2>/dev/null || true; \
|
||||||
|
sed -i "s|deb.debian.org|${APT_MIRROR}|g" /etc/apt/sources.list 2>/dev/null || true; \
|
||||||
|
fi
|
||||||
|
|
||||||
# Install system dependencies
|
# Install system dependencies
|
||||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
|||||||
@ -8,8 +8,17 @@ ARG PNPM_STORE_PATH=/root/.local/share/pnpm/store
|
|||||||
# ── Base: shared setup ────────────────────────────────────────────────────────
|
# ── Base: shared setup ────────────────────────────────────────────────────────
|
||||||
FROM node:22-alpine AS base
|
FROM node:22-alpine AS base
|
||||||
ARG PNPM_STORE_PATH
|
ARG PNPM_STORE_PATH
|
||||||
RUN corepack enable && corepack install -g pnpm@10.26.2
|
ARG NPM_REGISTRY
|
||||||
|
# Configure corepack registry before installing pnpm so the download itself
|
||||||
|
# succeeds in restricted networks (COREPACK_NPM_REGISTRY controls where
|
||||||
|
# corepack fetches package managers from).
|
||||||
|
RUN if [ -n "${NPM_REGISTRY}" ]; then \
|
||||||
|
export COREPACK_NPM_REGISTRY="${NPM_REGISTRY}"; \
|
||||||
|
fi && \
|
||||||
|
corepack enable && corepack install -g pnpm@10.26.2
|
||||||
RUN pnpm config set store-dir ${PNPM_STORE_PATH}
|
RUN pnpm config set store-dir ${PNPM_STORE_PATH}
|
||||||
|
# Optionally override npm registry for restricted networks (e.g. NPM_REGISTRY=https://registry.npmmirror.com)
|
||||||
|
RUN if [ -n "${NPM_REGISTRY}" ]; then pnpm config set registry "${NPM_REGISTRY}"; fi
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY frontend ./frontend
|
COPY frontend ./frontend
|
||||||
|
|
||||||
@ -27,8 +36,13 @@ RUN cd /app/frontend && SKIP_ENV_VALIDATION=1 pnpm build
|
|||||||
# ── Prod: minimal runtime with pre-built output ───────────────────────────────
|
# ── Prod: minimal runtime with pre-built output ───────────────────────────────
|
||||||
FROM node:22-alpine AS prod
|
FROM node:22-alpine AS prod
|
||||||
ARG PNPM_STORE_PATH
|
ARG PNPM_STORE_PATH
|
||||||
RUN corepack enable && corepack install -g pnpm@10.26.2
|
ARG NPM_REGISTRY
|
||||||
|
RUN if [ -n "${NPM_REGISTRY}" ]; then \
|
||||||
|
export COREPACK_NPM_REGISTRY="${NPM_REGISTRY}"; \
|
||||||
|
fi && \
|
||||||
|
corepack enable && corepack install -g pnpm@10.26.2
|
||||||
RUN pnpm config set store-dir ${PNPM_STORE_PATH}
|
RUN pnpm config set store-dir ${PNPM_STORE_PATH}
|
||||||
|
RUN if [ -n "${NPM_REGISTRY}" ]; then pnpm config set registry "${NPM_REGISTRY}"; fi
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY --from=builder /app/frontend ./frontend
|
COPY --from=builder /app/frontend ./frontend
|
||||||
EXPOSE 3000
|
EXPOSE 3000
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user