From 97f5720daeabf5db90cd1915d545b503a16d900d Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Wed, 3 Sep 2025 16:12:26 +0200 Subject: [PATCH 1/2] docker run, create: add shell completion for CDI devices for "--device" With this patch: docker info --format '{{json .DiscoveredDevices}}' [{"Source":"cdi","ID":"docker.com/gpu=webgpu"}] docker container create --device= docker container create --device=docker.com/gpu=webgpu docker run --device=docker.com/gpu=webgpu docker run --device= Signed-off-by: Sebastiaan van Stijn --- cli/command/container/completion.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/cli/command/container/completion.go b/cli/command/container/completion.go index 5cc45010f1f4..133871696a46 100644 --- a/cli/command/container/completion.go +++ b/cli/command/container/completion.go @@ -122,6 +122,7 @@ func addCompletions(cmd *cobra.Command, dockerCLI completion.APIClientProvider) _ = cmd.RegisterFlagCompletionFunc("cap-add", completeLinuxCapabilityNames) _ = cmd.RegisterFlagCompletionFunc("cap-drop", completeLinuxCapabilityNames) _ = cmd.RegisterFlagCompletionFunc("cgroupns", completeCgroupns()) + _ = cmd.RegisterFlagCompletionFunc("device", completeCDIDevices(dockerCLI)) _ = cmd.RegisterFlagCompletionFunc("env", completion.EnvVarNames) _ = cmd.RegisterFlagCompletionFunc("env-file", completion.FileNames) _ = cmd.RegisterFlagCompletionFunc("ipc", completeIpc(dockerCLI)) @@ -153,6 +154,26 @@ func completeDetachKeys(_ *cobra.Command, _ []string, _ string) ([]string, cobra return []string{"ctrl-"}, cobra.ShellCompDirectiveNoSpace } +// completeCDIDevices implements shell completion for the '--device' flag +// to provide completion for CDI devices that were discovered by the daemon. +func completeCDIDevices(dockerCLI completion.APIClientProvider) cobra.CompletionFunc { + return func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { + info, err := dockerCLI.Client().Info(cmd.Context()) + if err != nil { + return nil, cobra.ShellCompDirectiveError + } + var devices []string + // DiscoveredDevices requires Docker v28.2.0 (API 1.50) or above, + // but we just check if it's returned. + for _, di := range info.DiscoveredDevices { + if di.Source == "cdi" { + devices = append(devices, di.ID) + } + } + return devices, cobra.ShellCompDirectiveNoFileComp + } +} + // completeIpc implements shell completion for the `--ipc` option of `run` and `create`. // The completion is partly composite. func completeIpc(dockerCLI completion.APIClientProvider) cobra.CompletionFunc { From 33e4572048f214f0a4d2291879c5edf014b45f41 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Wed, 3 Sep 2025 16:33:32 +0200 Subject: [PATCH 2/2] WIP: also complete device paths Signed-off-by: Sebastiaan van Stijn --- cli/command/container/completion.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/cli/command/container/completion.go b/cli/command/container/completion.go index 133871696a46..4667c3104562 100644 --- a/cli/command/container/completion.go +++ b/cli/command/container/completion.go @@ -158,19 +158,24 @@ func completeDetachKeys(_ *cobra.Command, _ []string, _ string) ([]string, cobra // to provide completion for CDI devices that were discovered by the daemon. func completeCDIDevices(dockerCLI completion.APIClientProvider) cobra.CompletionFunc { return func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { + if strings.HasPrefix(toComplete, "/") { + return nil, cobra.ShellCompDirectiveDefault | cobra.ShellCompDirectiveNoSpace + } + info, err := dockerCLI.Client().Info(cmd.Context()) if err != nil { - return nil, cobra.ShellCompDirectiveError + return nil, cobra.ShellCompDirectiveDefault } var devices []string // DiscoveredDevices requires Docker v28.2.0 (API 1.50) or above, // but we just check if it's returned. for _, di := range info.DiscoveredDevices { if di.Source == "cdi" { - devices = append(devices, di.ID) + devices = append(devices, cobra.CompletionWithDesc(di.ID, "CDI device")) } } - return devices, cobra.ShellCompDirectiveNoFileComp + devices = append(devices, "/") + return devices, cobra.ShellCompDirectiveDefault } }