# Target vllm version: v0.28.0 (tag v0.28.0 @ 2cf0a6915ce5). # Keep VLLM_BASE_TAG aligned with the target vLLM release on every rebase. # # Release-boundary form: there is no precompiled-wheel pin here, because the # base image already ships exactly the target vLLM. Everything the runtime # needs — torch, flashinfer, nvJitLink, numpy — comes from that image as one # self-consistent set. # # This block reappears only when the rebase targets a vLLM commit that is NOT a # released tag. During the 0.27 rebase, targeting v0.27.0rc1 on top of the # v0.26.0 base image required reinstalling vLLM from wheels.vllm.ai and then # hand-repairing the fallout: pinning torch ahead of flashinfer (installing it # after bound flashinfer's TVM FFI runtime to the old torch and aborted engine # core init), registering libnvJitLink.so.13 with ldconfig, and re-pinning numpy # under numba's ceiling. All of it was compensation for a base image and a vLLM # that disagreed. At a real release boundary they agree, so none of it is # needed. The 0.28 rebase repeated the cycle: the v0.28.0rc / final-tag wheels # rode on the v0.27.0 base image with the full reinstall block until the # official v0.28.0 image shipped, at which point this file dropped back to the # form you are reading. If you pin an untagged commit again, restore the # reinstall block — agent/tasks/20_update_wheel_url.sh fails the run rather # than letting the Dockerfile silently ship the wrong vLLM. ARG VLLM_BASE_IMAGE=vllm/vllm-openai ARG VLLM_BASE_TAG=v0.28.0 # We use registry-based layer caching for the dependencies, # where the tag is determined based on the hash of the contents # of files like pyproject.toml, etc. The deps stage should have # everything except the actual project dir, since that should not # change much across branches. FROM ${VLLM_BASE_IMAGE}:${VLLM_BASE_TAG} AS deps # Keep APP_DIR outside /workspace so k8s Buildkite workspace mounts cannot # shadow the editable install target (#5364). Docker WORKDIR creates /opt if # needed. ARG APP_DIR=/opt/vllm-omni WORKDIR ${APP_DIR} RUN ln -sf /usr/bin/python3 /usr/bin/python # Placeholder package tree so editable install can register APP_DIR. # The final stage COPY --link fills this directory with the real sources; # the editable .pth / egg-link keeps resolving imports there — no PYTHONPATH. RUN mkdir -p vllm_omni && touch vllm_omni/__init__.py # Install system dependencies RUN apt-get update && \ apt-get install -y espeak-ng git jq && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* # Copy dependency related things first and install deps/ # We set the version str to 0.0.0 since it doesn't matter # for CI COPY pyproject.toml setup.py ./ COPY requirements/ requirements/ ENV SETUPTOOLS_SCM_PRETEND_VERSION=0.0.0 # Editable install: deps + project metadata are cached in this layer, while # the package itself is linked to APP_DIR (populated later by COPY --link). # Do NOT use a non-editable install here — that copies an empty stub into # site-packages and breaks ``import vllm_omni.entrypoints``. RUN uv pip install --system -e ".[dev]" # The final stage just copies the working dir on top of the # dependencies image. This uses --link so that we can skip # the image pull in Buildkite when we have a cache hit. # # IMPORTANT: Do not make any modifications that depend on the # file system after the --link copy, otherwise we'd need to pull # the heavy base image to build it. Editable install above already # registered APP_DIR, so we must not re-pip-install after COPY. FROM deps ARG APP_DIR=/opt/vllm-omni WORKDIR ${APP_DIR} COPY --link . . ENTRYPOINT []