From 8207944999ea358956ab8ac29e0c5f4ffa8a4ded Mon Sep 17 00:00:00 2001 From: Adam Clettborn Date: Tue, 29 Sep 2026 13:35:46 +0200 Subject: [PATCH] fix(compose): pass CDI device names through unchanged Compose expanded every devices entry to source:target:permissions, so a CDI qualified name reached nerdctl run as a malformed host path and the container failed to create. Signed-off-by: Adam Clettborn --- pkg/composer/serviceparser/serviceparser.go | 7 +++++++ pkg/composer/serviceparser/serviceparser_test.go | 2 ++ 2 files changed, 9 insertions(+) diff --git a/pkg/composer/serviceparser/serviceparser.go b/pkg/composer/serviceparser/serviceparser.go index 58b9393dbd4..d8a3cf50b71 100644 --- a/pkg/composer/serviceparser/serviceparser.go +++ b/pkg/composer/serviceparser/serviceparser.go @@ -29,6 +29,7 @@ import ( "time" "github.com/compose-spec/compose-go/v2/types" + cdiparser "tags.cncf.io/container-device-interface/pkg/parser" "github.com/containerd/log" @@ -563,6 +564,12 @@ func newContainer(project *types.Project, parsed *Service, i int) (*Container, e } for _, v := range svc.Devices { + // A CDI device is passed by its qualified name alone; `nerdctl run` + // only recognizes the name when nothing is appended to it. + if cdiparser.IsQualifiedName(v.Source) { + c.RunArgs = append(c.RunArgs, fmt.Sprintf("--device=%s", v.Source)) + continue + } c.RunArgs = append(c.RunArgs, fmt.Sprintf("--device=%s:%s:%s", v.Source, v.Target, v.Permissions)) } diff --git a/pkg/composer/serviceparser/serviceparser_test.go b/pkg/composer/serviceparser/serviceparser_test.go index ec23cdf6142..5feee8b9133 100644 --- a/pkg/composer/serviceparser/serviceparser_test.go +++ b/pkg/composer/serviceparser/serviceparser_test.go @@ -357,6 +357,7 @@ services: - /dev/a - /dev/b:/dev/b - /dev/c:/dev/c:rw + - vendor.com/class=name ` comp := testutil.NewComposeDir(t, dockerComposeYAML) defer comp.CleanUp() @@ -375,6 +376,7 @@ services: assert.Assert(t, in(c.RunArgs, "--device=/dev/a:/dev/a:rwm")) assert.Assert(t, in(c.RunArgs, "--device=/dev/b:/dev/b:rwm")) assert.Assert(t, in(c.RunArgs, "--device=/dev/c:/dev/c:rw")) + assert.Assert(t, in(c.RunArgs, "--device=vendor.com/class=name")) } }