Skip to content

Commit 081462f

Browse files
fix(ci): restrict UBI10 build, test, and manifest to CUDA 13.x only (#1515)
## Summary `nvidia/cuda` UBI10 base images are only published for CUDA 13.x — neither Docker Hub nor NGC provide them for any 12.x release. The CI was failing with `not found` when attempting to build the UBI10 image for CUDA 12.9.0. --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent a740647 commit 081462f

5 files changed

Lines changed: 36 additions & 48 deletions

File tree

.github/workflows/build_images.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ jobs:
113113
docker push "nvcr.io/nvstaging/nvaie/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-py${PYTHON_SHORT}-${ARCH}"
114114
115115
- name: Build UBI10 image and push to DockerHub and NGC
116+
if: ${{ startsWith(inputs.CUDA_VER, '13.') }}
116117
uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6.19.2
117118
with:
118119
context: ./ci/docker/context
@@ -127,6 +128,7 @@ jobs:
127128
tags: nvidia/cuopt:${{ inputs.IMAGE_TAG_PREFIX }}-cuda${{ steps.trim.outputs.CUDA_SHORT }}-ubi10-${{ matrix.ARCH }}
128129

129130
- name: Push UBI10 image to NGC
131+
if: ${{ startsWith(inputs.CUDA_VER, '13.') }}
130132
env:
131133
IMAGE_TAG_PREFIX: ${{ inputs.IMAGE_TAG_PREFIX }}
132134
ARCH: ${{ matrix.ARCH }}

.github/workflows/test_images.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ jobs:
7272
7373
test-ubi10:
7474
name: test-images-ubi10 (${{ inputs.ARCH }}, ${{ inputs.IMAGE_TAG_PREFIX }}-cuda${{ needs.prepare.outputs.CUDA_SHORT }}-ubi10)
75+
if: ${{ startsWith(inputs.CUDA_VER, '13.') }}
7576
runs-on: "linux-${{ inputs.ARCH }}-gpu-a100-latest-1"
7677
needs: prepare
7778
container:

README.md

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -152,21 +152,17 @@ The `latest` tag is the latest stable release. To pin a specific version use `<v
152152

153153
#### UBI10 image (FIPS 140-3)
154154

155-
Based on Red Hat Universal Base Image 10 (RHEL 10), which ships OpenSSL 3.5 validated under FIPS 140-3. Use this image in environments with strict FIPS or RHEL compliance requirements.
155+
Based on Red Hat Universal Base Image 10 (RHEL 10), which ships OpenSSL 3.5 validated under FIPS 140-3. Use this image in environments with strict FIPS or RHEL compliance requirements. UBI10 images are available for CUDA 13.x only.
156156

157157
```bash
158-
# For CUDA 12.x
159-
docker pull nvidia/cuopt:latest-cu12-ubi10
160-
161-
# For CUDA 13.x
162158
docker pull nvidia/cuopt:latest-cu13-ubi10
163159
```
164160

165-
Fully-qualified tags follow the pattern `<version>-cuda<X.Y>-ubi10` (e.g. `26.6.0-cuda13.3-ubi10`). Nightly builds use the `<version>a-cu<N>-ubi10` tag scheme. See the [cuOpt Docker Hub page](https://hub.docker.com/r/nvidia/cuopt/tags) for the full list.
161+
Fully-qualified tags follow the pattern `<version>-cuda<X.Y>-ubi10` (e.g. `26.6.0-cuda13.3-ubi10`). Nightly builds use the `<version>a-cu13-ubi10` tag scheme. See the [cuOpt Docker Hub page](https://hub.docker.com/r/nvidia/cuopt/tags) for the full list.
166162

167163
Both images include the same cuOpt packages (`libcuopt`, `cuopt`, `cuopt-server`, `cuopt-sh-client`) and expose the same server entrypoint. They are built and tested for x86-64 and ARM64.
168164

169-
Nightly container images for both variants are built from the HEAD of the development branch. They are tagged as `<version>a-cu12` / `<version>a-cu13` (Ubuntu) and `<version>a-cu12-ubi10` / `<version>a-cu13-ubi10` (UBI10).
165+
Nightly container images for both variants are built from the HEAD of the development branch. They are tagged as `<version>a-cu12` / `<version>a-cu13` (Ubuntu) and `<version>a-cu13-ubi10` (UBI10).
170166

171167
More information about the cuOpt container can be found [here](https://docs.nvidia.com/cuopt/user-guide/latest/cuopt-server/quick-start.html#container-from-docker-hub).
172168

ci/docker/create_multiarch_manifest.sh

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -109,43 +109,48 @@ else
109109
echo "Skipping latest manifest creation (IMAGE_TAG_PREFIX='${IMAGE_TAG_PREFIX}' is not a release version)"
110110
fi
111111

112-
echo "=== Creating UBI10 manifests ==="
113-
create_manifest \
114-
"nvidia/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-ubi10" \
115-
"nvidia/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-ubi10-amd64" \
116-
"nvidia/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-ubi10-arm64"
117-
create_manifest \
118-
"nvidia/cuopt:${IMAGE_TAG_PREFIX}-cu${CUDA_MAJOR}-ubi10" \
119-
"nvidia/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-ubi10-amd64" \
120-
"nvidia/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-ubi10-arm64"
121-
122-
create_manifest \
123-
"nvcr.io/nvstaging/nvaie/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-ubi10" \
124-
"nvcr.io/nvstaging/nvaie/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-ubi10-amd64" \
125-
"nvcr.io/nvstaging/nvaie/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-ubi10-arm64"
126-
create_manifest \
127-
"nvcr.io/nvstaging/nvaie/cuopt:${IMAGE_TAG_PREFIX}-cu${CUDA_MAJOR}-ubi10" \
128-
"nvcr.io/nvstaging/nvaie/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-ubi10-amd64" \
129-
"nvcr.io/nvstaging/nvaie/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-ubi10-arm64"
130-
131-
if [[ "${IMAGE_TAG_PREFIX}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] && [[ "${IMAGE_TAG_PREFIX}" != *"a"* ]]; then
112+
# UBI10 CUDA base images are only published for CUDA 13.x and later
113+
if [[ "${CUDA_MAJOR}" == "13" ]]; then
114+
echo "=== Creating UBI10 manifests ==="
132115
create_manifest \
133-
"nvidia/cuopt:latest-cuda${CUDA_SHORT}-ubi10" \
116+
"nvidia/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-ubi10" \
134117
"nvidia/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-ubi10-amd64" \
135118
"nvidia/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-ubi10-arm64"
136119
create_manifest \
137-
"nvidia/cuopt:latest-cu${CUDA_MAJOR}-ubi10" \
120+
"nvidia/cuopt:${IMAGE_TAG_PREFIX}-cu${CUDA_MAJOR}-ubi10" \
138121
"nvidia/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-ubi10-amd64" \
139122
"nvidia/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-ubi10-arm64"
140123

141124
create_manifest \
142-
"nvcr.io/nvstaging/nvaie/cuopt:latest-cuda${CUDA_SHORT}-ubi10" \
125+
"nvcr.io/nvstaging/nvaie/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-ubi10" \
143126
"nvcr.io/nvstaging/nvaie/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-ubi10-amd64" \
144127
"nvcr.io/nvstaging/nvaie/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-ubi10-arm64"
145128
create_manifest \
146-
"nvcr.io/nvstaging/nvaie/cuopt:latest-cu${CUDA_MAJOR}-ubi10" \
129+
"nvcr.io/nvstaging/nvaie/cuopt:${IMAGE_TAG_PREFIX}-cu${CUDA_MAJOR}-ubi10" \
147130
"nvcr.io/nvstaging/nvaie/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-ubi10-amd64" \
148131
"nvcr.io/nvstaging/nvaie/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-ubi10-arm64"
132+
133+
if [[ "${IMAGE_TAG_PREFIX}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] && [[ "${IMAGE_TAG_PREFIX}" != *"a"* ]]; then
134+
create_manifest \
135+
"nvidia/cuopt:latest-cuda${CUDA_SHORT}-ubi10" \
136+
"nvidia/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-ubi10-amd64" \
137+
"nvidia/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-ubi10-arm64"
138+
create_manifest \
139+
"nvidia/cuopt:latest-cu${CUDA_MAJOR}-ubi10" \
140+
"nvidia/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-ubi10-amd64" \
141+
"nvidia/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-ubi10-arm64"
142+
143+
create_manifest \
144+
"nvcr.io/nvstaging/nvaie/cuopt:latest-cuda${CUDA_SHORT}-ubi10" \
145+
"nvcr.io/nvstaging/nvaie/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-ubi10-amd64" \
146+
"nvcr.io/nvstaging/nvaie/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-ubi10-arm64"
147+
create_manifest \
148+
"nvcr.io/nvstaging/nvaie/cuopt:latest-cu${CUDA_MAJOR}-ubi10" \
149+
"nvcr.io/nvstaging/nvaie/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-ubi10-amd64" \
150+
"nvcr.io/nvstaging/nvaie/cuopt:${IMAGE_TAG_PREFIX}-cuda${CUDA_SHORT}-ubi10-arm64"
151+
fi
152+
else
153+
echo "Skipping UBI10 manifests (CUDA_MAJOR='${CUDA_MAJOR}' — UBI10 base images require CUDA 13+)"
149154
fi
150155

151156
echo "=== Multi-architecture manifest creation completed ==="

docs/cuopt/source/_static/install-selector.js

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,6 @@
4747
default: "docker pull nvidia/cuopt:latest-cu13",
4848
run: "docker run --gpus all -it --rm nvidia/cuopt:latest-cu13 /bin/bash",
4949
},
50-
"cu12-ubi10": {
51-
default: "docker pull nvidia/cuopt:latest-cu12-ubi10",
52-
run: "docker run --gpus all -it --rm nvidia/cuopt:latest-cu12-ubi10 /bin/bash",
53-
},
5450
"cu13-ubi10": {
5551
default: "docker pull nvidia/cuopt:latest-cu13-ubi10",
5652
run: "docker run --gpus all -it --rm nvidia/cuopt:latest-cu13-ubi10 /bin/bash",
@@ -65,10 +61,6 @@
6561
default: "docker pull nvidia/cuopt:" + V_NEXT + ".0a-cu13",
6662
run: "docker run --gpus all -it --rm nvidia/cuopt:" + V_NEXT + ".0a-cu13 /bin/bash",
6763
},
68-
"cu12-ubi10": {
69-
default: "docker pull nvidia/cuopt:" + V_NEXT + ".0a-cu12-ubi10",
70-
run: "docker run --gpus all -it --rm nvidia/cuopt:" + V_NEXT + ".0a-cu12-ubi10 /bin/bash",
71-
},
7264
"cu13-ubi10": {
7365
default: "docker pull nvidia/cuopt:" + V_NEXT + ".0a-cu13-ubi10",
7466
run: "docker run --gpus all -it --rm nvidia/cuopt:" + V_NEXT + ".0a-cu13-ubi10 /bin/bash",
@@ -230,10 +222,6 @@
230222
default: "docker pull nvidia/cuopt:latest-cu13",
231223
run: "docker run --gpus all -it --rm -p 8000:8000 -e CUOPT_SERVER_PORT=8000 nvidia/cuopt:latest-cu13",
232224
},
233-
"cu12-ubi10": {
234-
default: "docker pull nvidia/cuopt:latest-cu12-ubi10",
235-
run: "docker run --gpus all -it --rm -p 8000:8000 -e CUOPT_SERVER_PORT=8000 nvidia/cuopt:latest-cu12-ubi10",
236-
},
237225
"cu13-ubi10": {
238226
default: "docker pull nvidia/cuopt:latest-cu13-ubi10",
239227
run: "docker run --gpus all -it --rm -p 8000:8000 -e CUOPT_SERVER_PORT=8000 nvidia/cuopt:latest-cu13-ubi10",
@@ -248,10 +236,6 @@
248236
default: "docker pull nvidia/cuopt:" + V_NEXT + ".0a-cu13",
249237
run: "docker run --gpus all -it --rm -p 8000:8000 -e CUOPT_SERVER_PORT=8000 nvidia/cuopt:" + V_NEXT + ".0a-cu13",
250238
},
251-
"cu12-ubi10": {
252-
default: "docker pull nvidia/cuopt:" + V_NEXT + ".0a-cu12-ubi10",
253-
run: "docker run --gpus all -it --rm -p 8000:8000 -e CUOPT_SERVER_PORT=8000 nvidia/cuopt:" + V_NEXT + ".0a-cu12-ubi10",
254-
},
255239
"cu13-ubi10": {
256240
default: "docker pull nvidia/cuopt:" + V_NEXT + ".0a-cu13-ubi10",
257241
run: "docker run --gpus all -it --rm -p 8000:8000 -e CUOPT_SERVER_PORT=8000 nvidia/cuopt:" + V_NEXT + ".0a-cu13-ubi10",
@@ -300,7 +284,7 @@
300284
var variant = getSelectedValue("cuopt-variant") || "ubuntu";
301285
var baseCuda = cuda || "cu12";
302286
var cudaKey = baseCuda + (variant === "ubi10" ? "-ubi10" : "");
303-
var fallbackKey = "cu12" + (variant === "ubi10" ? "-ubi10" : "");
287+
var fallbackKey = (variant === "ubi10") ? "cu13-ubi10" : "cu12";
304288
var c = data[release][cudaKey] || data[release][fallbackKey];
305289
var hubPull = c.default;
306290
var tag = "latest-cu12";

0 commit comments

Comments
 (0)