Skip to content

Commit 97f5720

Browse files
committed
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=<tab> docker container create --device=docker.com/gpu=webgpu docker run --device=docker.com/gpu=webgpu docker run --device=<tab> Signed-off-by: Sebastiaan van Stijn <[email protected]>
1 parent c5467b5 commit 97f5720

File tree

1 file changed

+21
-0
lines changed

1 file changed

+21
-0
lines changed

cli/command/container/completion.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ func addCompletions(cmd *cobra.Command, dockerCLI completion.APIClientProvider)
122122
_ = cmd.RegisterFlagCompletionFunc("cap-add", completeLinuxCapabilityNames)
123123
_ = cmd.RegisterFlagCompletionFunc("cap-drop", completeLinuxCapabilityNames)
124124
_ = cmd.RegisterFlagCompletionFunc("cgroupns", completeCgroupns())
125+
_ = cmd.RegisterFlagCompletionFunc("device", completeCDIDevices(dockerCLI))
125126
_ = cmd.RegisterFlagCompletionFunc("env", completion.EnvVarNames)
126127
_ = cmd.RegisterFlagCompletionFunc("env-file", completion.FileNames)
127128
_ = cmd.RegisterFlagCompletionFunc("ipc", completeIpc(dockerCLI))
@@ -153,6 +154,26 @@ func completeDetachKeys(_ *cobra.Command, _ []string, _ string) ([]string, cobra
153154
return []string{"ctrl-"}, cobra.ShellCompDirectiveNoSpace
154155
}
155156

157+
// completeCDIDevices implements shell completion for the '--device' flag
158+
// to provide completion for CDI devices that were discovered by the daemon.
159+
func completeCDIDevices(dockerCLI completion.APIClientProvider) cobra.CompletionFunc {
160+
return func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
161+
info, err := dockerCLI.Client().Info(cmd.Context())
162+
if err != nil {
163+
return nil, cobra.ShellCompDirectiveError
164+
}
165+
var devices []string
166+
// DiscoveredDevices requires Docker v28.2.0 (API 1.50) or above,
167+
// but we just check if it's returned.
168+
for _, di := range info.DiscoveredDevices {
169+
if di.Source == "cdi" {
170+
devices = append(devices, di.ID)
171+
}
172+
}
173+
return devices, cobra.ShellCompDirectiveNoFileComp
174+
}
175+
}
176+
156177
// completeIpc implements shell completion for the `--ipc` option of `run` and `create`.
157178
// The completion is partly composite.
158179
func completeIpc(dockerCLI completion.APIClientProvider) cobra.CompletionFunc {

0 commit comments

Comments
 (0)