mrkeyoor.com_
Tue 01 Sept 17:39 UTC
Dev Toolsevaluationupdated 27 Aug 2026

cli review

Docker CLI is the Go client behind the `docker` command. It connects to a Docker daemon or context and gives users one interface for containers, images, builds, registries, networks, volumes, Swarm services, and plugins.

+13 / 4dstars / 7d
Verdict

Our docker-trust run installed 176 packages and built in 68 seconds, but its tests stopped with 3 of 7 packages failing to compile. That narrow failure does not undo Docker CLI's place as the standard client for Docker Engine, yet it blocks a clean recommendation for this commit to trust-plugin contributors. Use the shipped CLI for Docker workflows; build from source only when you can run the project's containerized checks and investigate the exact submodule you change.

We ran it

Lab card: what happened when we ran cliScreenshot of cli (github.com/docker/cli)
Install✓ · 30s176 packages
Build✓ · 38s
Tests✗ · 26s4 passed · 3 failed of 7 (go test)
Repo1372 files~109,485 lines of source · 5.9 MB · 11 CI workflows

Answers from our run

Does cli build from source?

Dependencies installed in 30 seconds (176 packages), and the build succeeded in 38 seconds. We cloned commit 45f5895 into a clean Debian container with 3 CPUs and no project-specific setup.

Do cli's tests pass?

Not all of them: 4 of 7 passed and 3 failed when we ran the project's own test command (go test). Some failures need services or credentials a bare container does not have.

Who should not use cli?

Users looking for a container engine in one binary: this repository is the client, so most commands still need a reachable daemon.

What are the alternatives to cli?

Podman, nerdctl, Finch. Our docker-trust run installed 176 packages and built in 68 seconds, but its tests stopped with 3 of 7 packages failing to compile.

Setup3/5Trust module builds, but 3 of 7 test packages fail
Docs4/5Extensive command reference; contributor README stays terse
Community5/5Pushed today with 874 active issues and PRs combined
Maturity4/5Established client with active fixes; measured trust tests fail

Discussed on

  1. hnI no longer build software1,287 points

Who it’s for

Developers and operators already using Docker Engine or Docker Desktop.
Tool authors who need the same configuration, context, and API behavior as the standard Docker client.
Contributors prepared to build and test through Docker Buildx and the repository's bake targets.
Teams managing local and remote daemons through named contexts and TLS settings.

Who it’s NOT for

Users looking for a container engine in one binary: this repository is the client, so most commands still need a reachable daemon.
Contributors who cannot use Docker for development: the README's source build, cross-build, lint, and test paths use docker buildx bake.
Teams needing the docker-trust subproject to pass at commit 45f5895: our run failed to compile 3 of 7 tested packages because test.TerminatePrompt was undefined.
Operators who assume every success message proves authentication: open issue 7237 reports a daemon-less Basic Auth path that accepts a registry's 401 response as Login Succeeded.
Projects that want a small, independent API client library: the checkout had about 109,485 source lines, while the measured trust module installed 176 packages.

Setup reality

Our sandbox entered cmd/docker-trust, installed 176 Go packages in 30 seconds, and built it in 38 seconds. Tests failed after 26 seconds: 4 packages passed and 3 failed out of 7. The compiler stopped at trust/revoke_test.go:160 because test.TerminatePrompt was undefined.

Using the normal CLI needs a Docker daemon locally or at a configured context. Remote endpoints may require host, CA, client certificate, and key settings; registry operations can require credentials. Contributing follows Docker Buildx bake targets rather than a plain root build.

The 5.9 MB checkout had 1,372 files and about 109,485 source lines. Our scan found 11 CI workflow files, no Dockerfile, and no tests directory. The measured result covers cmd/docker-trust, not the full CLI suite described by the root README.

One client controls containers, images, builds, and Swarm

Docker CLI is the familiar front end to Docker Engine. Its generated command reference covers container lifecycle, image transfer, BuildKit-backed builds, networks, volumes, contexts, registry login, and Swarm objects. The client can point at a local Unix socket or a remote daemon, with environment variables and flags controlling the host, API version, TLS certificates, and configuration directory. That breadth is why scripts often treat docker as the default container interface.

The binary is still a client. Commands such as run, pull, and inspect depend on an engine endpoint, while contexts decide which endpoint receives them. Configuration precedence is explicit: command-line options override environment variables, which override config.json. Teams switching among local, staging, and production daemons should use named contexts and inspect the active one, since a correct command sent to the wrong host can be more damaging than a syntax error.

Source development goes through Buildx bake targets

The root README says the repository is developed using Docker. Its standard commands are docker buildx bake for a source build, docker buildx bake cross for supported platforms, and bake targets for linting and tests. A Makefile path also exists for unit and full suites. This gives contributors repeatable containerized tooling, but it means the development setup depends on the product being built.

The repository itself is substantial: our checkout held 1,372 files and about 109,485 lines of source in 5.9 MB. We found 11 CI workflow files, which fits a project shipping across platforms and touching credentials, terminals, HTTP, plugins, and daemon APIs. There was no Dockerfile or tests directory in our scan. Tests are distributed through Go packages and bake definitions rather than gathered under a directory named tests.

What happened when we ran it

Our sandbox measured cmd/docker-trust at commit 45f5895, not the full CLI. Installing its Go module succeeded in 30 seconds and brought in 176 packages. The subproject built in 38 seconds inside an unprivileged Debian container with 3 CPUs, 8 GB of RAM, no secrets, and the golang:1.24-bookworm image.

The test step failed with exit code 1 after 26 seconds. Go reported 4 packages passed and 3 failed out of 7. The decisive line came from trust/revoke_test.go:160: undefined: test.TerminatePrompt. The trust package therefore failed during test compilation, while internal/registry and internal/trust logged successful results. The log does not establish why that symbol was unavailable, so blaming a Go version or dependency mismatch would be guesswork.

That outcome is narrower than saying Docker CLI's full test suite failed. We did not run the root bake test matrix, cross-build every platform, connect to a daemon, or exercise registry trust end to end. It is still actionable for someone changing cmd/docker-trust: the measured commit built its executable, but the available package test command did not produce a clean result in our stated environment.

Authentication has a daemon-less edge case

Docker's client can perform some registry login work when the daemon is unavailable. Open issue 7237 reports a specific flaw in that fallback: with a private registry using plain HTTP Basic Auth, a wrong password receives a 401 yet the CLI prints Login Succeeded and exits 0. The reporter says the same credentials fail correctly when the daemon is running. That report concerns one authentication path, not Docker Hub's usual bearer-token flow.

The safe operational rule is simple. Verify the daemon or selected context is reachable before diagnosing registry credentials, and confirm access with the operation you intend to perform. A success string from a fallback path should not be your only evidence. Configuration may contain registry credentials and client TLS keys, so permissions on the Docker config directory also matter.

Long-running terminal behavior still has open fixes

Issue 6005 reports 100 percent CPU use when docker run -i is placed in the shell background. A current pull request addresses the stdin handling. Issue 5299 says docker stack deploy --detach=false can wait forever when a one-shot service has completed successfully, and another active pull request proposes treating that task as converged. Both issues had activity in August 2026, which is better evidence of maintenance than an old tag.

GitHub recorded a push on August 27, 2026, and listed 874 open issues and pull requests combined. That queue is large because the CLI has a large surface and user base; it is not a count of confirmed bugs. The latest-release API returned no GitHub release, so release staleness cannot be judged from that endpoint. Current pushes and same-week issue work show that development is active.

Docker users should take the standard client; contributors need the full matrix

For operating Docker Engine, choosing this CLI is the least surprising option. It matches Docker's contexts, configuration, plugins, documentation, and daemon API conventions. Podman or nerdctl make more sense when the underlying engine is different or daemonless operation is the goal.

Source contributors face a higher bar than the 38-second trust build suggests. The project spans 109,485 source lines and 11 workflow files, and our focused tests found a compile failure that the build did not catch. Run the relevant package tests, then the prescribed bake targets for the affected platform and behavior. For cmd/docker-trust at commit 45f5895, the undefined test helper must be resolved before calling that subproject clean.

Alternatives

ProjectWhat it isPick it when
Podman gh↗A daemonless container engine and CLI with a Docker-familiar command model.pick this instead when you want the engine and client under one project or prefer rootless, daemonless operation.
nerdctlA Docker-compatible command-line client designed for containerd.pick this instead when containerd is the runtime you need to operate directly.
FinchA developer-focused container tool that bundles open components behind a simple CLI.pick this instead when you want a packaged local environment built around containerd and nerdctl.

What people are saying

  1. [github-trending] docker/cli
  2. [github-trending] googleworkspace/cli
  3. [producthunt] Ticket Fairy CLI
  4. [velocity-scout] angular/angular-cli
  5. [github-trending] stripe/link-cli
  6. [github-trending] aws/agentcore-cli

Sources

  1. Docker CLI README
  2. Docker command reference
  3. GitHub repository facts
  4. Issue 7237: Basic Auth login success on a 401 response
  5. Issue 6005: high CPU with background stdin
  6. Issue 5299: stack deploy wait on completed service

More dev tools reviews

workmux · v2rayNG · SecLists · hashcat · eslint · fastfetch · the whole board →