A high-throughput and memory-efficient inference and serving engine for LLMs
Mirrored from https://github.com/tduncan-lum/Nvidia-Optimization-Stack---VLLM.git
Synced Nov 4, 13:45 UTC
build: embed image provenance metadata in vLLM containers (#40653)
Signed-off-by: Alec Flowers <aflowers@nvidia.com> Co-authored-by: OpenAI Codex <codex@openai.com>
Alec committed
Apr 29, 2026 at 03:07 UTC
3f1a4bb639a9b65e2634a6529c90da36944d6472
8 files changed
+376
-10
.buildkite/image_build/image_build.sh
+1
@@ -192,6 +192,7 @@ export BUILDKITE_COMMIT
192
export PARENT_COMMIT
193
export IMAGE_TAG
194
export IMAGE_TAG_LATEST
195
+export COMMIT="${COMMIT:-${BUILDKITE_COMMIT}}"
196
export CACHE_FROM
197
export CACHE_FROM_BASE_BRANCH
198
export CACHE_FROM_MAIN
.buildkite/release-pipeline.yaml
+108
-8
@@ -121,7 +121,19 @@ steps:
121
queue: cpu_queue_release
122
commands:
123
- "aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9t5s3a7"
124
- - "DOCKER_BUILDKIT=1 docker build --build-arg max_jobs=16 --build-arg USE_SCCACHE=1 --build-arg GIT_REPO_CHECK=1 --build-arg CUDA_VERSION=13.0.2 --build-arg torch_cuda_arch_list=\"${CUDA_ARCH_X86}\" --build-arg INSTALL_KV_CONNECTORS=true --build-arg BUILD_BASE_IMAGE=nvidia/cuda:13.0.2-devel-ubuntu22.04 --tag public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m) --target vllm-openai --progress plain -f docker/Dockerfile ."
124
+ - |
125
+ DOCKER_BUILDKIT=1 docker build \
126
+ $(bash .buildkite/scripts/docker-build-metadata-args.sh) \
127
+ --build-arg max_jobs=16 \
128
+ --build-arg USE_SCCACHE=1 \
129
+ --build-arg GIT_REPO_CHECK=1 \
130
+ --build-arg CUDA_VERSION=13.0.2 \
131
+ --build-arg torch_cuda_arch_list="${CUDA_ARCH_X86}" \
132
+ --build-arg INSTALL_KV_CONNECTORS=true \
133
+ --build-arg BUILD_BASE_IMAGE=nvidia/cuda:13.0.2-devel-ubuntu22.04 \
134
+ --target vllm-openai \
135
+ --progress plain \
136
+ -f docker/Dockerfile .
137
- "docker push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)"
138
# re-tag to default image tag and push, just in case arm64 build fails
139
- "docker tag public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m) public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT"
@@ -134,7 +146,19 @@ steps:
146
queue: arm64_cpu_queue_release
147
commands:
148
- "aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9t5s3a7"
137
- - "DOCKER_BUILDKIT=1 docker build --build-arg max_jobs=16 --build-arg USE_SCCACHE=1 --build-arg GIT_REPO_CHECK=1 --build-arg CUDA_VERSION=13.0.2 --build-arg torch_cuda_arch_list=\"${CUDA_ARCH_AARCH64}\" --build-arg INSTALL_KV_CONNECTORS=true --build-arg BUILD_BASE_IMAGE=nvidia/cuda:13.0.2-devel-ubuntu22.04 --tag public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m) --target vllm-openai --progress plain -f docker/Dockerfile ."
149
+ - |
150
+ DOCKER_BUILDKIT=1 docker build \
151
+ $(bash .buildkite/scripts/docker-build-metadata-args.sh) \
152
+ --build-arg max_jobs=16 \
153
+ --build-arg USE_SCCACHE=1 \
154
+ --build-arg GIT_REPO_CHECK=1 \
155
+ --build-arg CUDA_VERSION=13.0.2 \
156
+ --build-arg torch_cuda_arch_list="${CUDA_ARCH_AARCH64}" \
157
+ --build-arg INSTALL_KV_CONNECTORS=true \
158
+ --build-arg BUILD_BASE_IMAGE=nvidia/cuda:13.0.2-devel-ubuntu22.04 \
159
+ --target vllm-openai \
160
+ --progress plain \
161
+ -f docker/Dockerfile .
162
- "docker push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)"
163
164
- label: "Build release image - x86_64 - CUDA 12.9"
@@ -144,7 +168,18 @@ steps:
168
queue: cpu_queue_release
169
commands:
170
- "aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9t5s3a7"
147
- - "DOCKER_BUILDKIT=1 docker build --build-arg max_jobs=16 --build-arg USE_SCCACHE=1 --build-arg GIT_REPO_CHECK=1 --build-arg CUDA_VERSION=12.9.1 --build-arg torch_cuda_arch_list=\"${CUDA_ARCH_X86_CU129}\" --build-arg INSTALL_KV_CONNECTORS=true --tag public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-cu129 --target vllm-openai --progress plain -f docker/Dockerfile ."
171
+ - |
172
+ DOCKER_BUILDKIT=1 docker build \
173
+ $(bash .buildkite/scripts/docker-build-metadata-args.sh cu129) \
174
+ --build-arg max_jobs=16 \
175
+ --build-arg USE_SCCACHE=1 \
176
+ --build-arg GIT_REPO_CHECK=1 \
177
+ --build-arg CUDA_VERSION=12.9.1 \
178
+ --build-arg torch_cuda_arch_list="${CUDA_ARCH_X86_CU129}" \
179
+ --build-arg INSTALL_KV_CONNECTORS=true \
180
+ --target vllm-openai \
181
+ --progress plain \
182
+ -f docker/Dockerfile .
183
- "docker push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-cu129"
184
# re-tag to default image tag and push, just in case arm64 build fails
185
- "docker tag public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-cu129 public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-cu129"
@@ -157,7 +192,18 @@ steps:
192
queue: arm64_cpu_queue_release
193
commands:
194
- "aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9t5s3a7"
160
- - "DOCKER_BUILDKIT=1 docker build --build-arg max_jobs=16 --build-arg USE_SCCACHE=1 --build-arg GIT_REPO_CHECK=1 --build-arg CUDA_VERSION=12.9.1 --build-arg torch_cuda_arch_list=\"${CUDA_ARCH_AARCH64_CU129}\" --build-arg INSTALL_KV_CONNECTORS=true --tag public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-cu129 --target vllm-openai --progress plain -f docker/Dockerfile ."
195
+ - |
196
+ DOCKER_BUILDKIT=1 docker build \
197
+ $(bash .buildkite/scripts/docker-build-metadata-args.sh cu129) \
198
+ --build-arg max_jobs=16 \
199
+ --build-arg USE_SCCACHE=1 \
200
+ --build-arg GIT_REPO_CHECK=1 \
201
+ --build-arg CUDA_VERSION=12.9.1 \
202
+ --build-arg torch_cuda_arch_list="${CUDA_ARCH_AARCH64_CU129}" \
203
+ --build-arg INSTALL_KV_CONNECTORS=true \
204
+ --target vllm-openai \
205
+ --progress plain \
206
+ -f docker/Dockerfile .
207
- "docker push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-cu129"
208
209
- label: "Build release image - x86_64 - CUDA 13.0 - Ubuntu 24.04"
@@ -167,7 +213,21 @@ steps:
213
queue: cpu_queue_release
214
commands:
215
- "aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9t5s3a7"
170
- - "DOCKER_BUILDKIT=1 docker build --build-arg max_jobs=16 --build-arg USE_SCCACHE=1 --build-arg GIT_REPO_CHECK=1 --build-arg CUDA_VERSION=13.0.2 --build-arg UBUNTU_VERSION=24.04 --build-arg GDRCOPY_OS_VERSION=Ubuntu24_04 --build-arg torch_cuda_arch_list=\"${CUDA_ARCH_X86}\" --build-arg INSTALL_KV_CONNECTORS=true --build-arg BUILD_BASE_IMAGE=nvidia/cuda:13.0.2-devel-ubuntu24.04 --tag public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-ubuntu2404 --target vllm-openai --progress plain -f docker/Dockerfile ."
216
+ - |
217
+ DOCKER_BUILDKIT=1 docker build \
218
+ $(bash .buildkite/scripts/docker-build-metadata-args.sh ubuntu2404) \
219
+ --build-arg max_jobs=16 \
220
+ --build-arg USE_SCCACHE=1 \
221
+ --build-arg GIT_REPO_CHECK=1 \
222
+ --build-arg CUDA_VERSION=13.0.2 \
223
+ --build-arg UBUNTU_VERSION=24.04 \
224
+ --build-arg GDRCOPY_OS_VERSION=Ubuntu24_04 \
225
+ --build-arg torch_cuda_arch_list="${CUDA_ARCH_X86}" \
226
+ --build-arg INSTALL_KV_CONNECTORS=true \
227
+ --build-arg BUILD_BASE_IMAGE=nvidia/cuda:13.0.2-devel-ubuntu24.04 \
228
+ --target vllm-openai \
229
+ --progress plain \
230
+ -f docker/Dockerfile .
231
- "docker push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-ubuntu2404"
232
- "docker tag public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-ubuntu2404 public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-ubuntu2404"
233
- "docker push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-ubuntu2404"
@@ -179,7 +239,21 @@ steps:
239
queue: arm64_cpu_queue_release
240
commands:
241
- "aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9t5s3a7"
182
- - "DOCKER_BUILDKIT=1 docker build --build-arg max_jobs=16 --build-arg USE_SCCACHE=1 --build-arg GIT_REPO_CHECK=1 --build-arg CUDA_VERSION=13.0.2 --build-arg UBUNTU_VERSION=24.04 --build-arg GDRCOPY_OS_VERSION=Ubuntu24_04 --build-arg torch_cuda_arch_list=\"${CUDA_ARCH_AARCH64}\" --build-arg INSTALL_KV_CONNECTORS=true --build-arg BUILD_BASE_IMAGE=nvidia/cuda:13.0.2-devel-ubuntu24.04 --tag public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-ubuntu2404 --target vllm-openai --progress plain -f docker/Dockerfile ."
242
+ - |
243
+ DOCKER_BUILDKIT=1 docker build \
244
+ $(bash .buildkite/scripts/docker-build-metadata-args.sh ubuntu2404) \
245
+ --build-arg max_jobs=16 \
246
+ --build-arg USE_SCCACHE=1 \
247
+ --build-arg GIT_REPO_CHECK=1 \
248
+ --build-arg CUDA_VERSION=13.0.2 \
249
+ --build-arg UBUNTU_VERSION=24.04 \
250
+ --build-arg GDRCOPY_OS_VERSION=Ubuntu24_04 \
251
+ --build-arg torch_cuda_arch_list="${CUDA_ARCH_AARCH64}" \
252
+ --build-arg INSTALL_KV_CONNECTORS=true \
253
+ --build-arg BUILD_BASE_IMAGE=nvidia/cuda:13.0.2-devel-ubuntu24.04 \
254
+ --target vllm-openai \
255
+ --progress plain \
256
+ -f docker/Dockerfile .
257
- "docker push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-ubuntu2404"
258
259
- label: "Build release image - x86_64 - CUDA 12.9 - Ubuntu 24.04"
@@ -189,7 +263,20 @@ steps:
263
queue: cpu_queue_release
264
commands:
265
- "aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9t5s3a7"
192
- - "DOCKER_BUILDKIT=1 docker build --build-arg max_jobs=16 --build-arg USE_SCCACHE=1 --build-arg GIT_REPO_CHECK=1 --build-arg CUDA_VERSION=12.9.1 --build-arg UBUNTU_VERSION=24.04 --build-arg GDRCOPY_OS_VERSION=Ubuntu24_04 --build-arg torch_cuda_arch_list=\"${CUDA_ARCH_X86_CU129}\" --build-arg INSTALL_KV_CONNECTORS=true --tag public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-cu129-ubuntu2404 --target vllm-openai --progress plain -f docker/Dockerfile ."
266
+ - |
267
+ DOCKER_BUILDKIT=1 docker build \
268
+ $(bash .buildkite/scripts/docker-build-metadata-args.sh cu129-ubuntu2404) \
269
+ --build-arg max_jobs=16 \
270
+ --build-arg USE_SCCACHE=1 \
271
+ --build-arg GIT_REPO_CHECK=1 \
272
+ --build-arg CUDA_VERSION=12.9.1 \
273
+ --build-arg UBUNTU_VERSION=24.04 \
274
+ --build-arg GDRCOPY_OS_VERSION=Ubuntu24_04 \
275
+ --build-arg torch_cuda_arch_list="${CUDA_ARCH_X86_CU129}" \
276
+ --build-arg INSTALL_KV_CONNECTORS=true \
277
+ --target vllm-openai \
278
+ --progress plain \
279
+ -f docker/Dockerfile .
280
- "docker push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-cu129-ubuntu2404"
281
- "docker tag public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-cu129-ubuntu2404 public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-cu129-ubuntu2404"
282
- "docker push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-cu129-ubuntu2404"
@@ -201,7 +288,20 @@ steps:
288
queue: arm64_cpu_queue_release
289
commands:
290
- "aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/q9t5s3a7"
204
- - "DOCKER_BUILDKIT=1 docker build --build-arg max_jobs=16 --build-arg USE_SCCACHE=1 --build-arg GIT_REPO_CHECK=1 --build-arg CUDA_VERSION=12.9.1 --build-arg UBUNTU_VERSION=24.04 --build-arg GDRCOPY_OS_VERSION=Ubuntu24_04 --build-arg torch_cuda_arch_list=\"${CUDA_ARCH_AARCH64_CU129}\" --build-arg INSTALL_KV_CONNECTORS=true --tag public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-cu129-ubuntu2404 --target vllm-openai --progress plain -f docker/Dockerfile ."
291
+ - |
292
+ DOCKER_BUILDKIT=1 docker build \
293
+ $(bash .buildkite/scripts/docker-build-metadata-args.sh cu129-ubuntu2404) \
294
+ --build-arg max_jobs=16 \
295
+ --build-arg USE_SCCACHE=1 \
296
+ --build-arg GIT_REPO_CHECK=1 \
297
+ --build-arg CUDA_VERSION=12.9.1 \
298
+ --build-arg UBUNTU_VERSION=24.04 \
299
+ --build-arg GDRCOPY_OS_VERSION=Ubuntu24_04 \
300
+ --build-arg torch_cuda_arch_list="${CUDA_ARCH_AARCH64_CU129}" \
301
+ --build-arg INSTALL_KV_CONNECTORS=true \
302
+ --target vllm-openai \
303
+ --progress plain \
304
+ -f docker/Dockerfile .
305
- "docker push public.ecr.aws/q9t5s3a7/vllm-release-repo:$BUILDKITE_COMMIT-$(uname -m)-cu129-ubuntu2404"
306
307
- block: "Build release image for x86_64 CPU"
.buildkite/scripts/docker-build-metadata-args.sh
new
+54
@@ -0,0 +1,54 @@
1
+#!/bin/bash
2
+# Emit docker build flags for release image provenance metadata.
3
+# Keep this helper best-effort: missing Buildkite metadata should fall back to
4
+# local/default values instead of blocking the Docker build.
5
+
6
+# Variant examples: "", "cu129", "ubuntu2404", "cu129-ubuntu2404".
7
+variant="${1:-}"
8
+variant_suffix="${variant:+-${variant}}"
9
+
10
+image_name="${VLLM_DOCKER_IMAGE_NAME:-vllm/vllm-openai}"
11
+staging_repo="${VLLM_STAGING_IMAGE_REPO:-public.ecr.aws/q9t5s3a7/vllm-release-repo}"
12
+build_commit="${VLLM_BUILD_COMMIT:-${BUILDKITE_COMMIT:-unknown}}"
13
+build_pipeline="${VLLM_BUILD_PIPELINE:-${BUILDKITE_PIPELINE_ID:-${BUILDKITE_PIPELINE_SLUG:-local}}}"
14
+build_url="${VLLM_BUILD_URL:-${BUILDKITE_BUILD_URL:-}}"
15
+tag_commit="${BUILDKITE_COMMIT:-${build_commit}}"
16
+
17
+if [[ -n "${BUILDKITE:-}" || -n "${BUILDKITE_COMMIT:-}" ]]; then
18
+ release_version="${RELEASE_VERSION:-}"
19
+ if command -v buildkite-agent >/dev/null 2>&1; then
20
+ release_version="${release_version:-$(buildkite-agent meta-data get release-version 2>/dev/null)}"
21
+ fi
22
+ release_version="${release_version#v}"
23
+ release_version="${release_version:-${tag_commit}}"
24
+
25
+ staging_image_ref="${staging_repo}:${tag_commit}-$(uname -m)${variant_suffix}"
26
+
27
+ if [[ "${NIGHTLY:-}" == "1" ]]; then
28
+ if [[ -z "${variant}" ]]; then
29
+ image_tag="${image_name}:nightly-${tag_commit}"
30
+ elif [[ "${variant}" == cu* ]]; then
31
+ cuda_variant="${variant%%-*}"
32
+ remaining_variant="${variant#${cuda_variant}}"
33
+ image_tag="${image_name}:${cuda_variant}-nightly-${tag_commit}${remaining_variant}"
34
+ else
35
+ image_tag="${image_name}:nightly-${tag_commit}${variant_suffix}"
36
+ fi
37
+ else
38
+ image_tag="${image_name}:v${release_version}${variant_suffix}"
39
+ fi
40
+else
41
+ image_tag="${VLLM_IMAGE_TAG:-local/vllm-openai:dev}"
42
+ staging_image_ref="${image_tag}"
43
+fi
44
+
45
+emit_arg() {
46
+ printf -- "--build-arg %s=%s " "$1" "$2"
47
+}
48
+
49
+emit_arg VLLM_BUILD_COMMIT "${build_commit}"
50
+emit_arg VLLM_BUILD_PIPELINE "${build_pipeline}"
51
+emit_arg VLLM_BUILD_URL "${build_url}"
52
+# This is the intended public tag. The final digest is only known after push.
53
+emit_arg VLLM_IMAGE_TAG "${image_tag}"
54
+printf -- "--tag %s " "${staging_image_ref}"
.buildkite/test_areas/docker.yaml
new
+16
@@ -0,0 +1,16 @@
1
+group: Docker
2
+depends_on:
3
+ - image-build-cpu
4
+steps:
5
+- label: Docker Build Metadata
6
+ timeout_in_minutes: 10
7
+ device: cpu-small
8
+ source_file_dependencies:
9
+ - .buildkite/release-pipeline.yaml
10
+ - .buildkite/scripts/docker-build-metadata-args.sh
11
+ - docker/Dockerfile
12
+ - docker/Dockerfile.cpu
13
+ - docker/docker-bake.hcl
14
+ - tests/tools/test_docker_build_metadata_args.py
15
+ commands:
16
+ - pytest -v -s tools/test_docker_build_metadata_args.py
docker/Dockerfile
+16
@@ -763,6 +763,10 @@ FROM vllm-base AS vllm-openai-base
763
ARG TARGETPLATFORM
764
ARG INSTALL_KV_CONNECTORS=false
765
ARG CUDA_VERSION
766
+ARG VLLM_BUILD_COMMIT
767
+ARG VLLM_BUILD_PIPELINE
768
+ARG VLLM_BUILD_URL
769
+ARG VLLM_IMAGE_TAG
770
771
ARG PIP_INDEX_URL UV_INDEX_URL
772
ARG PIP_EXTRA_INDEX_URL UV_EXTRA_INDEX_URL
@@ -799,6 +803,18 @@ RUN --mount=type=cache,target=/root/.cache/uv \
803
fi
804
805
ENV VLLM_USAGE_SOURCE production-docker-image
806
+ENV VLLM_BUILD_COMMIT=${VLLM_BUILD_COMMIT:-unknown} \
807
+ VLLM_BUILD_PIPELINE=${VLLM_BUILD_PIPELINE:-local} \
808
+ VLLM_BUILD_URL=${VLLM_BUILD_URL:-} \
809
+ VLLM_IMAGE_TAG=${VLLM_IMAGE_TAG:-local/vllm-openai:dev}
810
+LABEL org.opencontainers.image.source="https://github.com/vllm-project/vllm" \
811
+ org.opencontainers.image.revision="${VLLM_BUILD_COMMIT}" \
812
+ org.opencontainers.image.version="${VLLM_IMAGE_TAG}" \
813
+ org.opencontainers.image.url="${VLLM_BUILD_URL}" \
814
+ ai.vllm.build.commit="${VLLM_BUILD_COMMIT}" \
815
+ ai.vllm.build.pipeline="${VLLM_BUILD_PIPELINE}" \
816
+ ai.vllm.build.url="${VLLM_BUILD_URL}" \
817
+ ai.vllm.image.tag="${VLLM_IMAGE_TAG}"
818
819
# define sagemaker first, so it is not default from `docker build`
820
FROM vllm-openai-base AS vllm-sagemaker
docker/Dockerfile.cpu
+1
@@ -192,6 +192,7 @@ ADD ./tests/ ./tests/
192
ADD ./examples/ ./examples/
193
ADD ./benchmarks/ ./benchmarks/
194
ADD ./vllm/collect_env.py .
195
+ADD ./docker/ ./docker/
196
ADD ./.buildkite/ ./.buildkite/
197
198
# install development dependencies (for testing)
docker/docker-bake.hcl
+28
-2
@@ -27,6 +27,22 @@ variable "COMMIT" {
27
default = ""
28
}
29
30
+variable "VLLM_BUILD_COMMIT" {
31
+ default = "unknown"
32
+}
33
+
34
+variable "VLLM_BUILD_PIPELINE" {
35
+ default = "local"
36
+}
37
+
38
+variable "VLLM_BUILD_URL" {
39
+ default = ""
40
+}
41
+
42
+variable "VLLM_IMAGE_TAG" {
43
+ default = "local/vllm-openai:dev"
44
+}
45
+
46
# Groups
47
48
group "default" {
@@ -46,6 +62,10 @@ target "_common" {
62
max_jobs = MAX_JOBS
63
nvcc_threads = NVCC_THREADS
64
torch_cuda_arch_list = TORCH_CUDA_ARCH_LIST
65
+ VLLM_BUILD_COMMIT = VLLM_BUILD_COMMIT != "unknown" ? VLLM_BUILD_COMMIT : (COMMIT != "" ? COMMIT : "unknown")
66
+ VLLM_BUILD_PIPELINE = VLLM_BUILD_PIPELINE
67
+ VLLM_BUILD_URL = VLLM_BUILD_URL
68
+ VLLM_IMAGE_TAG = VLLM_IMAGE_TAG
69
}
70
}
71
@@ -56,10 +76,16 @@ target "_labels" {
76
"org.opencontainers.image.title" = "vLLM"
77
"org.opencontainers.image.description" = "vLLM: A high-throughput and memory-efficient inference and serving engine for LLMs"
78
"org.opencontainers.image.licenses" = "Apache-2.0"
59
- "org.opencontainers.image.revision" = COMMIT
79
+ "org.opencontainers.image.revision" = VLLM_BUILD_COMMIT != "unknown" ? VLLM_BUILD_COMMIT : (COMMIT != "" ? COMMIT : "unknown")
80
+ "org.opencontainers.image.version" = VLLM_IMAGE_TAG
81
+ "org.opencontainers.image.url" = VLLM_BUILD_URL
82
+ "ai.vllm.build.commit" = VLLM_BUILD_COMMIT != "unknown" ? VLLM_BUILD_COMMIT : (COMMIT != "" ? COMMIT : "unknown")
83
+ "ai.vllm.build.pipeline" = VLLM_BUILD_PIPELINE
84
+ "ai.vllm.build.url" = VLLM_BUILD_URL
85
+ "ai.vllm.image.tag" = VLLM_IMAGE_TAG
86
}
87
annotations = [
62
- "index,manifest:org.opencontainers.image.revision=${COMMIT}",
88
+ "index,manifest:org.opencontainers.image.revision=${VLLM_BUILD_COMMIT != "unknown" ? VLLM_BUILD_COMMIT : (COMMIT != "" ? COMMIT : "unknown")}",
89
]
90
}
91
tests/tools/test_docker_build_metadata_args.py
new
+152
@@ -0,0 +1,152 @@
1
+# SPDX-License-Identifier: Apache-2.0
2
+# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
+
4
+import os
5
+import shlex
6
+import subprocess
7
+from pathlib import Path
8
+
9
+REPO_ROOT = Path(__file__).resolve().parents[2]
10
+HELPER = REPO_ROOT / ".buildkite" / "scripts" / "docker-build-metadata-args.sh"
11
+
12
+
13
+def run_helper(
14
+ *args: str,
15
+ env: dict[str, str] | None = None,
16
+ path: str | None = None,
17
+) -> list[str]:
18
+ helper_env = {"PATH": path or os.environ["PATH"]}
19
+ if env:
20
+ helper_env.update(env)
21
+ result = subprocess.run(
22
+ ["bash", str(HELPER), *args],
23
+ check=True,
24
+ env=helper_env,
25
+ stdout=subprocess.PIPE,
26
+ text=True,
27
+ )
28
+ return shlex.split(result.stdout)
29
+
30
+
31
+def option_values(args: list[str], option: str) -> list[str]:
32
+ return [args[i + 1] for i, arg in enumerate(args[:-1]) if arg == option]
33
+
34
+
35
+def build_args(args: list[str]) -> dict[str, str]:
36
+ values = {}
37
+ for value in option_values(args, "--build-arg"):
38
+ key, arg_value = value.split("=", 1)
39
+ values[key] = arg_value
40
+ return values
41
+
42
+
43
+def test_release_metadata_args_prefer_pipeline_id() -> None:
44
+ args = run_helper(
45
+ "cu130-ubuntu2404",
46
+ env={
47
+ "BUILDKITE": "1",
48
+ "BUILDKITE_COMMIT": "abc123",
49
+ "BUILDKITE_PIPELINE_ID": "pipe-uuid",
50
+ "BUILDKITE_PIPELINE_SLUG": "release",
51
+ "BUILDKITE_BUILD_URL": "https://buildkite.example/vllm/builds/1",
52
+ "RELEASE_VERSION": "v0.20.0",
53
+ },
54
+ )
55
+
56
+ assert build_args(args) == {
57
+ "VLLM_BUILD_COMMIT": "abc123",
58
+ "VLLM_BUILD_PIPELINE": "pipe-uuid",
59
+ "VLLM_BUILD_URL": "https://buildkite.example/vllm/builds/1",
60
+ "VLLM_IMAGE_TAG": "vllm/vllm-openai:v0.20.0-cu130-ubuntu2404",
61
+ }
62
+ expected_tag = (
63
+ "public.ecr.aws/q9t5s3a7/vllm-release-repo:"
64
+ f"abc123-{os.uname().machine}-cu130-ubuntu2404"
65
+ )
66
+ assert option_values(args, "--tag") == [expected_tag]
67
+
68
+
69
+def test_nightly_metadata_args_fall_back_to_pipeline_slug() -> None:
70
+ args = run_helper(
71
+ "ubuntu2404",
72
+ env={
73
+ "BUILDKITE": "1",
74
+ "BUILDKITE_COMMIT": "def456",
75
+ "BUILDKITE_PIPELINE_SLUG": "release",
76
+ "BUILDKITE_BUILD_URL": "https://buildkite.example/vllm/builds/2",
77
+ "NIGHTLY": "1",
78
+ },
79
+ )
80
+
81
+ assert build_args(args) == {
82
+ "VLLM_BUILD_COMMIT": "def456",
83
+ "VLLM_BUILD_PIPELINE": "release",
84
+ "VLLM_BUILD_URL": "https://buildkite.example/vllm/builds/2",
85
+ "VLLM_IMAGE_TAG": "vllm/vllm-openai:nightly-def456-ubuntu2404",
86
+ }
87
+ expected_tag = (
88
+ "public.ecr.aws/q9t5s3a7/vllm-release-repo:"
89
+ f"def456-{os.uname().machine}-ubuntu2404"
90
+ )
91
+ assert option_values(args, "--tag") == [expected_tag]
92
+
93
+
94
+def test_local_metadata_args_use_local_overrides() -> None:
95
+ args = run_helper(
96
+ env={
97
+ "VLLM_IMAGE_TAG": "local/test:dev",
98
+ "VLLM_BUILD_COMMIT": "localsha",
99
+ "VLLM_BUILD_PIPELINE": "local-pipeline",
100
+ "VLLM_BUILD_URL": "https://buildkite.example/local",
101
+ },
102
+ )
103
+
104
+ assert build_args(args) == {
105
+ "VLLM_BUILD_COMMIT": "localsha",
106
+ "VLLM_BUILD_PIPELINE": "local-pipeline",
107
+ "VLLM_BUILD_URL": "https://buildkite.example/local",
108
+ "VLLM_IMAGE_TAG": "local/test:dev",
109
+ }
110
+ assert option_values(args, "--tag") == ["local/test:dev"]
111
+
112
+
113
+def test_release_version_lookup_failure_falls_back_to_commit(
114
+ tmp_path: Path,
115
+) -> None:
116
+ fake_bin = tmp_path / "bin"
117
+ fake_bin.mkdir()
118
+ buildkite_agent = fake_bin / "buildkite-agent"
119
+ buildkite_agent.write_text("#!/bin/sh\nexit 1\n")
120
+ buildkite_agent.chmod(0o755)
121
+
122
+ args = run_helper(
123
+ "cu129",
124
+ env={
125
+ "BUILDKITE": "1",
126
+ "BUILDKITE_COMMIT": "fallback123",
127
+ "BUILDKITE_PIPELINE_SLUG": "release",
128
+ },
129
+ path=f"{fake_bin}:{os.environ['PATH']}",
130
+ )
131
+
132
+ assert build_args(args)["VLLM_IMAGE_TAG"] == ("vllm/vllm-openai:vfallback123-cu129")
133
+
134
+
135
+def test_vllm_openai_image_embeds_metadata_contract() -> None:
136
+ dockerfile = (REPO_ROOT / "docker" / "Dockerfile").read_text()
137
+
138
+ for expected in (
139
+ "ARG VLLM_BUILD_COMMIT",
140
+ "ARG VLLM_BUILD_PIPELINE",
141
+ "ARG VLLM_BUILD_URL",
142
+ "ARG VLLM_IMAGE_TAG",
143
+ "VLLM_BUILD_COMMIT=${VLLM_BUILD_COMMIT:-unknown}",
144
+ "VLLM_BUILD_PIPELINE=${VLLM_BUILD_PIPELINE:-local}",
145
+ "VLLM_BUILD_URL=${VLLM_BUILD_URL:-}",
146
+ "VLLM_IMAGE_TAG=${VLLM_IMAGE_TAG:-local/vllm-openai:dev}",
147
+ 'ai.vllm.build.commit="${VLLM_BUILD_COMMIT}"',
148
+ 'ai.vllm.build.pipeline="${VLLM_BUILD_PIPELINE}"',
149
+ 'ai.vllm.build.url="${VLLM_BUILD_URL}"',
150
+ 'ai.vllm.image.tag="${VLLM_IMAGE_TAG}"',
151
+ ):
152
+ assert expected in dockerfile