94057c3d3e
PR Test (NPU) / check-changes (push) Has been cancelled
PR Test (NPU) / pr-gate (push) Has been cancelled
PR Test (NPU) / set-image-config (push) Has been cancelled
PR Test (NPU) / stage-b-test-1-npu-a2 (0) (push) Has been cancelled
PR Test (NPU) / stage-b-test-1-npu-a2 (1) (push) Has been cancelled
PR Test (NPU) / stage-b-test-2-npu-a2 (0) (push) Has been cancelled
PR Test (NPU) / stage-b-test-2-npu-a2 (1) (push) Has been cancelled
PR Test (NPU) / stage-b-test-4-npu-a3 (push) Has been cancelled
PR Test (NPU) / stage-b-test-16-npu-a3 (push) Has been cancelled
PR Test (NPU) / multimodal-gen-test-1-npu-a3 (push) Has been cancelled
PR Test (NPU) / multimodal-gen-test-2-npu-a3 (push) Has been cancelled
PR Test (Arm64) / pr-gate (push) Has been cancelled
PR Test (Arm64) / check-changes (push) Has been cancelled
PR Test (Arm64) / build-test (push) Has been cancelled
PR Test (sgl-router) / gate (push) Has been cancelled
PR Test (sgl-router) / tier-1 — lint (push) Has been cancelled
PR Test (sgl-router) / tier-2 — build + test (push) Has been cancelled
PR Test (sgl-router) / tier-3 — docker (placeholder) (push) Has been cancelled
PR Test (sgl-router) / tier-3 — k8s integration (push) Has been cancelled
PR Test (sgl-router) / tier-3 — e2e (push) Has been cancelled
PR Test (sgl-router) / finish (push) Has been cancelled
PR Test (NPU) / single-node-poc (map[name:qwen3_6_27b_w8a8_1p_in64k_out1k_50ms runner:linux-aarch64-a3-2 test_case:test/registered/ascend/performance/qwen3_6_27b/test_npu_qwen3_6_27b_w8a8_1p_in64k_out1k_50ms.py test_type:perf]) (push) Has been cancelled
PR Test (NPU) / pr-test-npu-finish (push) Has been cancelled
PR Test (Xeon) / pr-gate (push) Has been cancelled
PR Test (Xeon) / check-changes (push) Has been cancelled
PR Test (Xeon) / build-test (, xeon-gnr, base-b-test-cpu) (push) Has been cancelled
PR Test (XPU) / check-changes (push) Has been cancelled
PR Test (XPU) / pr-gate (push) Has been cancelled
PR Test (XPU) / stage-a-test-1-gpu-xpu (push) Has been cancelled
PR Test (XPU) / wait-for-stage-a (push) Has been cancelled
PR Test (XPU) / stage-b-test-1-gpu-xpu (push) Has been cancelled
PR Test (XPU) / finish (push) Has been cancelled
CI Model Inventory / build-inventory (push) Has been cancelled
Lint / lint (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark Compilation Check (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark - Manual Policy (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark - Request Processing (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark Summary (push) Has been cancelled
PR Test (SMG) / build-wheel (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on windows (x86_64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on macos (x86_64 - auto) (push) Has been cancelled
PR Test (SMG) / python-unit-tests (push) Has been cancelled
PR Test (SMG) / unit-tests (push) Has been cancelled
PR Test (SMG) / benchmarks (push) Has been cancelled
PR Test (SMG) / chat-completions (push) Has been cancelled
PR Test (SMG) / chat-completions-4gpu (push) Has been cancelled
PR Test (SMG) / e2e (push) Has been cancelled
PR Test (SMG) / docker-build-test (push) Has been cancelled
PR Test (SMG) / k8s-integration (push) Has been cancelled
PR Test (SMG) / finish (push) Has been cancelled
PR Test (SMG) / summarize-benchmarks (push) Has been cancelled
Release SGLang Model Gateway Docker Image / publish (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on macos (aarch64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (aarch64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (x86_64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (aarch64 - musllinux_1_1) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (x86_64 - musllinux_1_1) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / Build SDist (push) Has been cancelled
Release SGLang Model Gateway to PyPI / Upload to PyPI (push) Has been cancelled
Release SGLang Kernels / build-cu129-matrix (aarch64, 12.9, 3.10, arm-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / build-cu129-matrix (x86_64, 12.9, 3.10, x64-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / release-cu129 (push) Has been cancelled
Release SGLang Kernels / build-cu130-matrix (aarch64, 13.0, 3.10, arm-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / build-cu130-matrix (x86_64, 13.0, 3.10, x64-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / release-cu130 (push) Has been cancelled
Release SGLang Kernels / build-rocm-matrix (3.10, 700) (push) Has been cancelled
Release SGLang Kernels / build-rocm-matrix (3.10, 720) (push) Has been cancelled
Release SGLang Kernels / release-rocm700 (push) Has been cancelled
Release SGLang Kernels / release-rocm720 (push) Has been cancelled
Release SGLang Kernels / build-musa43 (43, 3.10) (push) Has been cancelled
Release SGLang Kernels / release-musa43 (push) Has been cancelled
93 lines
4.0 KiB
Docker
93 lines
4.0 KiB
Docker
# Multi-stage build for sgl-router.
|
|
#
|
|
# Three stages, each scoped to its caching contract:
|
|
# 1. chef — generate a `recipe.json` describing the dep graph.
|
|
# 2. builder — compile deps from the recipe, then the workspace.
|
|
# 3. runtime — distroless cc-debian12 with the stripped binary.
|
|
#
|
|
# The `cargo-chef` indirection is the canonical Rust multi-stage cache
|
|
# pattern: the recipe step's inputs are JUST `Cargo.toml` + `Cargo.lock`,
|
|
# so a source-only change produces a recipe-layer cache hit and the
|
|
# heavy `cook --release` step is reused untouched. A naive "copy
|
|
# manifests → cargo fetch → copy src" approach caches only the fetched
|
|
# registry; every source change still recompiles every dep.
|
|
#
|
|
# `Cargo.lock` is gitignored repo-wide (root .gitignore "# Rust lib"
|
|
# block), so we generate it inside the chef stage with `cargo
|
|
# generate-lockfile` and propagate that lockfile to the builder via
|
|
# `COPY --from=chef`. Both stages thus build against the same lockfile,
|
|
# preserving --locked semantics within a single Docker build.
|
|
#
|
|
# Build (from the repo root):
|
|
# docker build -f docker/sgl-router.Dockerfile -t sgl-router:dev .
|
|
# Run:
|
|
# docker run --rm -p 8090:8090 \
|
|
# -v $(pwd)/docker/sgl-router.sample.yaml:/etc/sgl-router/sgl-router.yaml \
|
|
# sgl-router:dev --config /etc/sgl-router/sgl-router.yaml
|
|
#
|
|
# Image budget: < 100 MB stripped (M6 acceptance). Verify with
|
|
# `docker image inspect sgl-router:dev --format '{{.Size}}'`.
|
|
|
|
ARG RUST_VERSION=1.90
|
|
ARG DEBIAN_VERSION=bookworm
|
|
|
|
######################## STAGE 1 — chef recipe ##########################
|
|
FROM rust:${RUST_VERSION}-${DEBIAN_VERSION} AS chef
|
|
RUN cargo install cargo-chef --locked --version ^0.1
|
|
WORKDIR /work
|
|
COPY experimental/sgl-router/Cargo.toml ./
|
|
COPY experimental/sgl-router/rust-toolchain.toml ./
|
|
# Stub a minimal src tree so cargo can resolve the workspace, generate
|
|
# the lockfile (gitignored upstream), then prepare the chef recipe.
|
|
RUN mkdir -p src && echo "fn main() {}" > src/main.rs \
|
|
&& echo "" > src/lib.rs \
|
|
&& cargo generate-lockfile \
|
|
&& cargo chef prepare --recipe-path recipe.json \
|
|
&& rm -rf src
|
|
|
|
######################## STAGE 2 — builder ##############################
|
|
FROM rust:${RUST_VERSION}-${DEBIAN_VERSION} AS builder
|
|
RUN cargo install cargo-chef --locked --version ^0.1
|
|
WORKDIR /work
|
|
|
|
# `dynamo-tokenizers` pulls in `pcre2-sys`, whose build.rs links the SYSTEM
|
|
# libpcre2-8 whenever pkg-config finds it (it does here — the rust:bookworm
|
|
# base ships libpcre2-dev). That dynamic dep is absent from the distroless
|
|
# runtime, so the binary fails at startup with "libpcre2-8.so.0: cannot open
|
|
# shared object file". Force pcre2-sys to compile its vendored PCRE2 and link
|
|
# it statically, keeping the runtime self-contained.
|
|
ENV PCRE2_SYS_STATIC=1
|
|
|
|
COPY --from=chef /work/recipe.json ./recipe.json
|
|
COPY --from=chef /work/Cargo.lock ./Cargo.lock
|
|
COPY experimental/sgl-router/rust-toolchain.toml ./
|
|
|
|
# Cook (compile + cache) the dep graph from the recipe. This layer's
|
|
# inputs are recipe.json + the toolchain — code changes in src/ do NOT
|
|
# invalidate it.
|
|
RUN cargo chef cook --release --recipe-path recipe.json
|
|
|
|
# Now bring in the real sources and the manifest they need.
|
|
COPY experimental/sgl-router/Cargo.toml ./
|
|
COPY experimental/sgl-router/src ./src
|
|
|
|
# --locked is intentionally omitted: the lockfile is generated in-container
|
|
# (gitignored upstream) and `cargo chef cook` may have mutated it during the
|
|
# dep-cook step, so a strict --locked check would spuriously fail.
|
|
RUN cargo build --release --bin sgl-router \
|
|
&& strip target/release/sgl-router
|
|
|
|
######################## STAGE 3 — runtime ##############################
|
|
FROM gcr.io/distroless/cc-debian12:nonroot AS runtime
|
|
|
|
COPY --from=builder /work/target/release/sgl-router /usr/local/bin/sgl-router
|
|
|
|
# Default config path; mount your own via `-v <host-path>:/etc/sgl-router`.
|
|
ENV SGL_ROUTER_CONFIG=/etc/sgl-router/sgl-router.yaml
|
|
EXPOSE 8090
|
|
|
|
# distroless `nonroot` runs as uid 65532. The router doesn't need root.
|
|
USER nonroot:nonroot
|
|
|
|
ENTRYPOINT ["/usr/local/bin/sgl-router"]
|