diff --git a/cli/command/container/completion.go b/cli/command/container/completion.go index 5cc45010f1f4..4667c3104562 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,31 @@ 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) { + if strings.HasPrefix(toComplete, "/") { + return nil, cobra.ShellCompDirectiveDefault | cobra.ShellCompDirectiveNoSpace + } + + info, err := dockerCLI.Client().Info(cmd.Context()) + if err != nil { + 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, cobra.CompletionWithDesc(di.ID, "CDI device")) + } + } + devices = append(devices, "/") + return devices, cobra.ShellCompDirectiveDefault + } +} + // completeIpc implements shell completion for the `--ipc` option of `run` and `create`. // The completion is partly composite. func completeIpc(dockerCLI completion.APIClientProvider) cobra.CompletionFunc {