diff --git a/cli/command/completion/functions.go b/cli/command/completion/functions.go index 5665a274fd..2272a53ab0 100644 --- a/cli/command/completion/functions.go +++ b/cli/command/completion/functions.go @@ -116,14 +116,16 @@ func NetworkNames(dockerCLI APIClientProvider) cobra.CompletionFunc { // export MY_VAR=hello // docker run --rm --env MY_VAR alpine printenv MY_VAR // hello -func EnvVarNames(_ *cobra.Command, _ []string, _ string) (names []string, _ cobra.ShellCompDirective) { - envs := os.Environ() - names = make([]string, 0, len(envs)) - for _, env := range envs { - name, _, _ := strings.Cut(env, "=") - names = append(names, name) +func EnvVarNames() cobra.CompletionFunc { + return func(_ *cobra.Command, _ []string, _ string) (names []string, _ cobra.ShellCompDirective) { + envs := os.Environ() + names = make([]string, 0, len(envs)) + for _, env := range envs { + name, _, _ := strings.Cut(env, "=") + names = append(names, name) + } + return names, cobra.ShellCompDirectiveNoFileComp } - return names, cobra.ShellCompDirectiveNoFileComp } // FromList offers completion for the given list of options. diff --git a/cli/command/completion/functions_test.go b/cli/command/completion/functions_test.go index ce675ebace..7190374676 100644 --- a/cli/command/completion/functions_test.go +++ b/cli/command/completion/functions_test.go @@ -176,7 +176,7 @@ func TestCompleteEnvVarNames(t *testing.T) { "ENV_A": "hello-a", "ENV_B": "hello-b", }) - values, directives := EnvVarNames(nil, nil, "") + values, directives := EnvVarNames()(nil, nil, "") assert.Check(t, is.Equal(directives&cobra.ShellCompDirectiveNoFileComp, cobra.ShellCompDirectiveNoFileComp), "Should not perform file completion") sort.Strings(values) diff --git a/cli/command/container/completion.go b/cli/command/container/completion.go index 5cc45010f1..a9fba5a5e4 100644 --- a/cli/command/container/completion.go +++ b/cli/command/container/completion.go @@ -122,7 +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("env", completion.EnvVarNames) + _ = cmd.RegisterFlagCompletionFunc("env", completion.EnvVarNames()) _ = cmd.RegisterFlagCompletionFunc("env-file", completion.FileNames) _ = cmd.RegisterFlagCompletionFunc("ipc", completeIpc(dockerCLI)) _ = cmd.RegisterFlagCompletionFunc("link", completeLink(dockerCLI)) diff --git a/cli/command/container/exec.go b/cli/command/container/exec.go index 48c8d5f30f..70e768373f 100644 --- a/cli/command/container/exec.go +++ b/cli/command/container/exec.go @@ -78,7 +78,7 @@ func newExecCommand(dockerCLI command.Cli) *cobra.Command { flags.StringVarP(&options.Workdir, "workdir", "w", "", "Working directory inside the container") flags.SetAnnotation("workdir", "version", []string{"1.35"}) - _ = cmd.RegisterFlagCompletionFunc("env", completion.EnvVarNames) + _ = cmd.RegisterFlagCompletionFunc("env", completion.EnvVarNames()) _ = cmd.RegisterFlagCompletionFunc("env-file", completion.FileNames) return cmd diff --git a/cli/command/service/create.go b/cli/command/service/create.go index 3037a7943f..ee021424d1 100644 --- a/cli/command/service/create.go +++ b/cli/command/service/create.go @@ -82,7 +82,7 @@ func newCreateCommand(dockerCLI command.Cli) *cobra.Command { // _ = cmd.RegisterFlagCompletionFunc(flagStopSignal, completeSignals) _ = cmd.RegisterFlagCompletionFunc(flagMode, completion.FromList("replicated", "global", "replicated-job", "global-job")) - _ = cmd.RegisterFlagCompletionFunc(flagEnv, completion.EnvVarNames) // TODO(thaJeztah): flagEnvRemove (needs to read current env-vars on the service) + _ = cmd.RegisterFlagCompletionFunc(flagEnv, completion.EnvVarNames()) // TODO(thaJeztah): flagEnvRemove (needs to read current env-vars on the service) _ = cmd.RegisterFlagCompletionFunc(flagEnvFile, completion.FileNames) _ = cmd.RegisterFlagCompletionFunc(flagNetwork, completion.NetworkNames(dockerCLI)) _ = cmd.RegisterFlagCompletionFunc(flagRestartCondition, completion.FromList("none", "on-failure", "any")) diff --git a/cli/command/service/update.go b/cli/command/service/update.go index e51c037c71..b1e56a7934 100644 --- a/cli/command/service/update.go +++ b/cli/command/service/update.go @@ -121,7 +121,7 @@ func newUpdateCommand(dockerCLI command.Cli) *cobra.Command { // _ = cmd.RegisterFlagCompletionFunc(flagCapDrop, completeLinuxCapabilityNames) // _ = cmd.RegisterFlagCompletionFunc(flagStopSignal, completeSignals) - _ = cmd.RegisterFlagCompletionFunc(flagEnvAdd, completion.EnvVarNames) + _ = cmd.RegisterFlagCompletionFunc(flagEnvAdd, completion.EnvVarNames()) // TODO(thaJeztah): flagEnvRemove (needs to read current env-vars on the service) _ = cmd.RegisterFlagCompletionFunc("image", completion.ImageNames(dockerCLI, -1)) _ = cmd.RegisterFlagCompletionFunc(flagNetworkAdd, completion.NetworkNames(dockerCLI))