DockerCLI/cli/command/container
Sebastiaan van Stijn 90058df305
cli/command/container: remove reportError, and put StatusError to use
The `reportError` utility was present because cli.StatusError would print
the error decorated with `Status: <error-message>, Code: <exit-code>`.
That was not desirable in many cases as it would mess-up the output. To
prevent this, the CLI had code to check for an empty `Status` (error message)
in which case the error would be "ignored" (and only used for the exit-status),
and the `reportError` utility would be used to manually print a custom error
message before returning the error.

Now that bca2090061 fixed the output format
of `cli.StatusError`, and 3dd6fc365d and
350a0b68a9 no longer discard these error,
we can get rid of this utility, and just set the error-message for
the status-error.

This patch:

- Introduces a `withHelp` which takes care of decorating errors with
  a "Run --help" hint for the user.
- Introduces a `toStatusError` utility that detects certain errors in
  the container to assign a corresponding exit-code (these error-codes
  can be used to distinguish "client" errors from "container" errors).
- Removes the `reportError` utility, and removes code that manually
  printed errors before returning.

Behavior is mostly unmodified, with the exception of some slight reformatting
of the errors:

- `withHelp` adds a `docker:` prefix to the error, to indicate the error
  is produced by the `docker` command. This prefix was already present
  in most cases.
- The "--help" hint is slightly updated ("Run 'docker run --help' for
  more information" instead of "See 'docker run --help'"), to make it
  more clear that it's a "call to action".
- An empty is added before the "--help" hint to separate it better from
  the error-message.

Before this patch:

    $ docker run --pull=invalid-option alpine
    docker: invalid pull option: 'invalid-option': must be one of "always", "missing" or "never".
    See 'docker run --help'.
    $ echo $?
    125

    $ docker run --rm alpine nosuchcommand
    docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "nosuchcommand": executable file not found in $PATH: unknown.
    $ echo $?
    127

With this patch:

    $ docker run --pull=invalid-option alpine
    docker: invalid pull option: 'invalid-option': must be one of "always", "missing" or "never"

    Run 'docker run --help' for more information
    $ echo $?
    125

    $ docker run --rm alpine nosuchcommand
    docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "nosuchcommand": executable file not found in $PATH: unknown.

    Run 'docker run --help' for more information
    $ echo $?
    127

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2024-07-17 15:59:30 +02:00
..
testdata docker ps: always use --quiet, also combined with --format 2023-04-10 01:12:00 +02:00
attach.go replace uses of deprecated API types 2024-07-04 15:22:18 +02:00
attach_test.go replace uses of deprecated API types 2024-07-04 15:22:18 +02:00
client_test.go replace uses of deprecated API types 2024-07-04 15:22:18 +02:00
cmd.go Update gometalinter 2017-10-26 12:21:02 -04:00
commit.go Plumb contexts through commands 2023-12-12 22:30:16 +01:00
completion.go cli/command/container: add completion for --stop-signal 2024-07-17 01:25:34 +02:00
cp.go vendor: github.com/docker/docker a736d0701c41 (master, v27.0.0-dev) 2024-06-10 17:41:09 +02:00
cp_test.go cli/command/container: TestSplitCpArg: cleaner skip 2024-07-04 19:57:43 +02:00
create.go cli/command/container: remove reportError, and put StatusError to use 2024-07-17 15:59:30 +02:00
create_test.go cli/command/container: remove reportError, and put StatusError to use 2024-07-17 15:59:30 +02:00
diff.go Plumb contexts through commands 2023-12-12 22:30:16 +01:00
exec.go cli/command/completion: add EnvVarNames utility 2024-07-17 01:25:32 +02:00
exec_test.go replace uses of deprecated API types 2024-07-04 15:22:18 +02:00
export.go Plumb contexts through commands 2023-12-12 22:30:16 +01:00
export_test.go test spring-cleaning 2024-07-04 01:35:12 +02:00
formatter_diff.go linting: address else/if/elseif statements found by gocritic 2023-11-20 16:02:16 +01:00
formatter_diff_test.go vendor: github.com/docker/docker v24.0.0-rc.1.0.20230505222407-8d9a40a82034 2023-05-06 00:34:34 +02:00
formatter_stats.go golangci-lint: enable dupword linter 2023-11-20 16:02:18 +01:00
formatter_stats_test.go cli/command/container: add BenchmarkStatsFormat() 2022-05-13 21:26:38 +02:00
hijack.go cli/command/container: hijackedIOStreamer: explicitly ignore err 2023-05-03 17:01:08 +02:00
inspect.go Update go:build comments to go1.21 2024-06-18 12:17:13 +02:00
kill.go cli/command/container: add completion for --stop-signal 2024-07-17 01:25:34 +02:00
list.go cli/command: don't use pflags.XXXVarP for flags without shorthand 2024-01-29 11:16:38 +01:00
list_test.go replace uses of deprecated API types 2024-07-04 15:22:18 +02:00
logs.go Plumb contexts through commands 2023-12-12 22:30:16 +01:00
logs_test.go replace uses of deprecated API types 2024-07-04 15:22:18 +02:00
opts.go linting: fmt.Errorf can be replaced with errors.New (perfsprint) 2024-06-10 21:19:31 +02:00
opts_test.go linting: fmt.Sprintf can be replaced with string concatenation (perfsprint) 2024-06-10 21:19:32 +02:00
pause.go replace uses of deprecated API types 2024-07-04 15:22:18 +02:00
port.go Plumb contexts through commands 2023-12-12 22:30:16 +01:00
port_test.go replace uses of deprecated API types 2024-07-04 15:22:18 +02:00
prune.go chore: remove backticks and resolve linting issues 2024-04-02 15:54:29 +02:00
prune_test.go test spring-cleaning 2024-07-04 01:35:12 +02:00
rename.go Plumb contexts through commands 2023-12-12 22:30:16 +01:00
restart.go cli/command/container: add completion for --stop-signal 2024-07-17 01:25:34 +02:00
rm.go Plumb contexts through commands 2023-12-12 22:30:16 +01:00
rm_test.go test spring-cleaning 2024-07-04 01:35:12 +02:00
run.go cli/command/container: remove reportError, and put StatusError to use 2024-07-17 15:59:30 +02:00
run_test.go cli/command/container: remove reportError, and put StatusError to use 2024-07-17 15:59:30 +02:00
signals.go cli/command/container: ForwardAllSignals: rewrite to use ContainerAPIClient 2023-11-08 15:15:09 +01:00
signals_test.go cli/command/container: ForwardAllSignals: rewrite to use ContainerAPIClient 2023-11-08 15:15:09 +01:00
signals_unix.go remove pre-go1.17 build-tags 2023-05-05 18:23:03 +02:00
signals_unix_test.go cli/command/container: ForwardAllSignals: rewrite to use ContainerAPIClient 2023-11-08 15:15:09 +01:00
signals_windows.go Ignore SIGURG on Darwin too 2021-05-24 19:37:53 +01:00
start.go replace uses of deprecated API types 2024-07-04 15:22:18 +02:00
stats.go linting: fmt.Errorf can be replaced with errors.New (perfsprint) 2024-06-10 21:19:31 +02:00
stats_helpers.go vendor: github.com/docker/docker 1a1f3cff45ec (master, v27.0-dev) 2024-06-20 13:04:54 +02:00
stats_helpers_test.go vendor: github.com/docker/docker 1a1f3cff45ec (master, v27.0-dev) 2024-06-20 13:04:54 +02:00
stop.go cli/command/container: add completion for --stop-signal 2024-07-17 01:25:34 +02:00
top.go Plumb contexts through commands 2023-12-12 22:30:16 +01:00
tty.go golangci-lint: revive: enable import-shadowing 2023-11-20 19:52:41 +01:00
tty_test.go vendor: github.com/docker/docker cdb3f9fb8dca (v25.0.0-dev) 2023-10-13 22:09:04 +02:00
unpause.go replace uses of deprecated API types 2024-07-04 15:22:18 +02:00
update.go cli/command/container: add completion for --restart 2024-07-17 01:25:34 +02:00
utils.go vendor: github.com/docker/docker a736d0701c41 (master, v27.0.0-dev) 2024-06-10 17:41:09 +02:00
utils_test.go cli/command/container: waitExitOrRemoved: take APIClient as argument 2023-07-24 09:54:11 +02:00
wait.go rename vars to prevent colliding with imports 2024-07-03 17:09:41 +02:00