From 851277f96671ba333a4ba4efdba06558538dc6d7 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Sun, 9 Jun 2024 14:34:01 +0200 Subject: [PATCH] cli/command/container: rename some variables Rename some variables to prevent shadowing and for clarity. Also made some minor formatting changes. Signed-off-by: Sebastiaan van Stijn --- cli/command/container/cp.go | 8 +-- cli/command/container/exec.go | 115 ++++++++++++++++------------------ 2 files changed, 57 insertions(+), 66 deletions(-) diff --git a/cli/command/container/cp.go b/cli/command/container/cp.go index b6c05d37b0..7dfd11defc 100644 --- a/cli/command/container/cp.go +++ b/cli/command/container/cp.go @@ -433,18 +433,18 @@ func copyToContainer(ctx context.Context, dockerCli command.Cli, copyConfig cpCo // so we have to check for a `/` or `.` prefix. Also, in the case of a Windows // client, a `:` could be part of an absolute Windows path, in which case it // is immediately proceeded by a backslash. -func splitCpArg(arg string) (container, path string) { +func splitCpArg(arg string) (ctr, path string) { if system.IsAbs(arg) { // Explicit local absolute path, e.g., `C:\foo` or `/foo`. return "", arg } - container, path, ok := strings.Cut(arg, ":") - if !ok || strings.HasPrefix(container, ".") { + ctr, path, ok := strings.Cut(arg, ":") + if !ok || strings.HasPrefix(ctr, ".") { // Either there's no `:` in the arg // OR it's an explicit local relative path like `./file:name.txt`. return "", arg } - return container, path + return ctr, path } diff --git a/cli/command/container/exec.go b/cli/command/container/exec.go index e1dc6716af..68b1a9b6cd 100644 --- a/cli/command/container/exec.go +++ b/cli/command/container/exec.go @@ -12,7 +12,7 @@ import ( "github.com/docker/cli/cli/config/configfile" "github.com/docker/cli/opts" "github.com/docker/docker/api/types" - apiclient "github.com/docker/docker/client" + "github.com/docker/docker/client" "github.com/pkg/errors" "github.com/sirupsen/logrus" "github.com/spf13/cobra" @@ -43,19 +43,18 @@ func NewExecOptions() ExecOptions { // NewExecCommand creates a new cobra.Command for `docker exec` func NewExecCommand(dockerCli command.Cli) *cobra.Command { options := NewExecOptions() - var container string cmd := &cobra.Command{ Use: "exec [OPTIONS] CONTAINER COMMAND [ARG...]", Short: "Execute a command in a running container", Args: cli.RequiresMinArgs(2), RunE: func(cmd *cobra.Command, args []string) error { - container = args[0] + containerIDorName := args[0] options.Command = args[1:] - return RunExec(cmd.Context(), dockerCli, container, options) + return RunExec(cmd.Context(), dockerCli, containerIDorName, options) }, - ValidArgsFunction: completion.ContainerNames(dockerCli, false, func(container types.Container) bool { - return container.State != "paused" + ValidArgsFunction: completion.ContainerNames(dockerCli, false, func(ctr types.Container) bool { + return ctr.State != "paused" }), Annotations: map[string]string{ "category-top": "2", @@ -79,47 +78,41 @@ 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", - func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { - return os.Environ(), cobra.ShellCompDirectiveNoFileComp - }, - ) - cmd.RegisterFlagCompletionFunc( - "env-file", - func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { - return nil, cobra.ShellCompDirectiveDefault // _filedir - }, - ) + _ = cmd.RegisterFlagCompletionFunc("env", func(*cobra.Command, []string, string) ([]string, cobra.ShellCompDirective) { + return os.Environ(), cobra.ShellCompDirectiveNoFileComp + }) + _ = cmd.RegisterFlagCompletionFunc("env-file", func(*cobra.Command, []string, string) ([]string, cobra.ShellCompDirective) { + return nil, cobra.ShellCompDirectiveDefault // _filedir + }) return cmd } // RunExec executes an `exec` command -func RunExec(ctx context.Context, dockerCli command.Cli, container string, options ExecOptions) error { - execConfig, err := parseExec(options, dockerCli.ConfigFile()) +func RunExec(ctx context.Context, dockerCli command.Cli, containerIDorName string, options ExecOptions) error { + execOptions, err := parseExec(options, dockerCli.ConfigFile()) if err != nil { return err } - client := dockerCli.Client() + apiClient := dockerCli.Client() // We need to check the tty _before_ we do the ContainerExecCreate, because // otherwise if we error out we will leak execIDs on the server (and // there's no easy way to clean those up). But also in order to make "not // exist" errors take precedence we do a dummy inspect first. - if _, err := client.ContainerInspect(ctx, container); err != nil { + if _, err := apiClient.ContainerInspect(ctx, containerIDorName); err != nil { return err } - if !execConfig.Detach { - if err := dockerCli.In().CheckTty(execConfig.AttachStdin, execConfig.Tty); err != nil { + if !execOptions.Detach { + if err := dockerCli.In().CheckTty(execOptions.AttachStdin, execOptions.Tty); err != nil { return err } } - fillConsoleSize(execConfig, dockerCli) + fillConsoleSize(execOptions, dockerCli) - response, err := client.ContainerExecCreate(ctx, container, *execConfig) + response, err := apiClient.ContainerExecCreate(ctx, containerIDorName, *execOptions) if err != nil { return err } @@ -129,15 +122,14 @@ func RunExec(ctx context.Context, dockerCli command.Cli, container string, optio return errors.New("exec ID empty") } - if execConfig.Detach { - execStartCheck := types.ExecStartCheck{ - Detach: execConfig.Detach, - Tty: execConfig.Tty, - ConsoleSize: execConfig.ConsoleSize, - } - return client.ContainerExecStart(ctx, execID, execStartCheck) + if execOptions.Detach { + return apiClient.ContainerExecStart(ctx, execID, types.ExecStartCheck{ + Detach: execOptions.Detach, + Tty: execOptions.Tty, + ConsoleSize: execOptions.ConsoleSize, + }) } - return interactiveExec(ctx, dockerCli, execConfig, execID) + return interactiveExec(ctx, dockerCli, execOptions, execID) } func fillConsoleSize(execConfig *types.ExecConfig, dockerCli command.Cli) { @@ -147,34 +139,33 @@ func fillConsoleSize(execConfig *types.ExecConfig, dockerCli command.Cli) { } } -func interactiveExec(ctx context.Context, dockerCli command.Cli, execConfig *types.ExecConfig, execID string) error { +func interactiveExec(ctx context.Context, dockerCli command.Cli, execOptions *types.ExecConfig, execID string) error { // Interactive exec requested. var ( out, stderr io.Writer in io.ReadCloser ) - if execConfig.AttachStdin { + if execOptions.AttachStdin { in = dockerCli.In() } - if execConfig.AttachStdout { + if execOptions.AttachStdout { out = dockerCli.Out() } - if execConfig.AttachStderr { - if execConfig.Tty { + if execOptions.AttachStderr { + if execOptions.Tty { stderr = dockerCli.Out() } else { stderr = dockerCli.Err() } } - fillConsoleSize(execConfig, dockerCli) + fillConsoleSize(execOptions, dockerCli) - client := dockerCli.Client() - execStartCheck := types.ExecStartCheck{ - Tty: execConfig.Tty, - ConsoleSize: execConfig.ConsoleSize, - } - resp, err := client.ContainerExecAttach(ctx, execID, execStartCheck) + apiClient := dockerCli.Client() + resp, err := apiClient.ContainerExecAttach(ctx, execID, types.ExecStartCheck{ + Tty: execOptions.Tty, + ConsoleSize: execOptions.ConsoleSize, + }) if err != nil { return err } @@ -191,17 +182,17 @@ func interactiveExec(ctx context.Context, dockerCli command.Cli, execConfig *typ outputStream: out, errorStream: stderr, resp: resp, - tty: execConfig.Tty, - detachKeys: execConfig.DetachKeys, + tty: execOptions.Tty, + detachKeys: execOptions.DetachKeys, } return streamer.stream(ctx) }() }() - if execConfig.Tty && dockerCli.In().IsTerminal() { + if execOptions.Tty && dockerCli.In().IsTerminal() { if err := MonitorTtySize(ctx, dockerCli, execID, true); err != nil { - fmt.Fprintln(dockerCli.Err(), "Error monitoring TTY size:", err) + _, _ = fmt.Fprintln(dockerCli.Err(), "Error monitoring TTY size:", err) } } @@ -210,14 +201,14 @@ func interactiveExec(ctx context.Context, dockerCli command.Cli, execConfig *typ return err } - return getExecExitStatus(ctx, client, execID) + return getExecExitStatus(ctx, apiClient, execID) } -func getExecExitStatus(ctx context.Context, client apiclient.ContainerAPIClient, execID string) error { - resp, err := client.ContainerExecInspect(ctx, execID) +func getExecExitStatus(ctx context.Context, apiClient client.ContainerAPIClient, execID string) error { + resp, err := apiClient.ContainerExecInspect(ctx, execID) if err != nil { // If we can't connect, then the daemon probably died. - if !apiclient.IsErrConnectionFailed(err) { + if !client.IsErrConnectionFailed(err) { return err } return cli.StatusError{StatusCode: -1} @@ -232,7 +223,7 @@ func getExecExitStatus(ctx context.Context, client apiclient.ContainerAPIClient, // parseExec parses the specified args for the specified command and generates // an ExecConfig from it. func parseExec(execOpts ExecOptions, configFile *configfile.ConfigFile) (*types.ExecConfig, error) { - execConfig := &types.ExecConfig{ + execOptions := &types.ExecConfig{ User: execOpts.User, Privileged: execOpts.Privileged, Tty: execOpts.TTY, @@ -243,23 +234,23 @@ func parseExec(execOpts ExecOptions, configFile *configfile.ConfigFile) (*types. // collect all the environment variables for the container var err error - if execConfig.Env, err = opts.ReadKVEnvStrings(execOpts.EnvFile.GetAll(), execOpts.Env.GetAll()); err != nil { + if execOptions.Env, err = opts.ReadKVEnvStrings(execOpts.EnvFile.GetAll(), execOpts.Env.GetAll()); err != nil { return nil, err } // If -d is not set, attach to everything by default if !execOpts.Detach { - execConfig.AttachStdout = true - execConfig.AttachStderr = true + execOptions.AttachStdout = true + execOptions.AttachStderr = true if execOpts.Interactive { - execConfig.AttachStdin = true + execOptions.AttachStdin = true } } if execOpts.DetachKeys != "" { - execConfig.DetachKeys = execOpts.DetachKeys + execOptions.DetachKeys = execOpts.DetachKeys } else { - execConfig.DetachKeys = configFile.DetachKeys + execOptions.DetachKeys = configFile.DetachKeys } - return execConfig, nil + return execOptions, nil }