Skip to content

Help command is racy #4145

Description

@crazy-max

Description

Follow-up #4142 (comment)

Changes from #4129 seems to introduce a racy behavior for the help command.

Reproduce

Here is a script to repro:

#!/bin/bash
output=$(mktemp -d -t cli-output.XXXXXXXXXX)#trap "rm -rf $output" EXITecho"Output: $output"
cat >"$output/orig.txt"<<EOLFlag shorthand -h has been deprecated, please use --helpUsage: docker [OPTIONS] COMMANDA self-sufficient runtime for containersCommon Commands: run Create and run a new container from an image exec Execute a command in a running container ps List containers build Build an image from a Dockerfile pull Download an image from a registry push Upload an image to a registry images List images login Log in to a registry logout Log out from a registry search Search Docker Hub for images version Show the Docker version information info Display system-wide informationManagement Commands: builder Manage builds buildx* Docker Buildx (Docker Inc., v0.10.3) compose* Docker Compose (Docker Inc., v2.15.1) container Manage containers context Manage contexts dev* Docker Dev Environments (Docker Inc., v0.1.0) extension* Manages Docker extensions (Docker Inc., v0.2.18) image Manage images manifest Manage Docker image manifests and manifest lists network Manage networks plugin Manage plugins sbom* View the packaged-based Software Bill Of Materials (SBOM) for an image (Anchore Inc., 0.6.0) scan* Docker Scan (Docker Inc., v0.25.0) scout* Command line tool for Docker Scout (Docker Inc., v0.6.0) system Manage Docker trust Manage trust on Docker images volume Manage volumesSwarm Commands: config Manage Swarm configs node Manage Swarm nodes secret Manage Swarm secrets service Manage Swarm services stack Manage Swarm stacks swarm Manage SwarmCommands: attach Attach local standard input, output, and error streams to a running container commit Create a new image from a container's changes cp Copy files/folders between a container and the local filesystem create Create a new container diff Inspect changes to files or directories on a container's filesystem events Get real time events from the server export Export a container's filesystem as a tar archive history Show the history of an image import Import the contents from a tarball to create a filesystem image inspect Return low-level information on Docker objects kill Kill one or more running containers load Load an image from a tar archive or STDIN logs Fetch the logs of a container pause Pause all processes within one or more containers port List port mappings or a specific mapping for the container rename Rename a container restart Restart one or more containers rm Remove one or more containers rmi Remove one or more images save Save one or more images to a tar archive (streamed to STDOUT by default) start Start one or more stopped containers stats Display a live stream of container(s) resource usage statistics stop Stop one or more running containers tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE top Display the running processes of a container unpause Unpause all processes within one or more containers update Update configuration of one or more containers wait Block until one or more containers stop, then print their exit codesGlobal Options: --config string Location of client config files (default "/home/crazy/.docker") -c, --context string Name of the context to use to connect to the daemon (overrides DOCKER_HOST env var and default context set with "docker context use") -D, --debug Enable debug mode -H, --host list Daemon socket(s) to connect to -l, --log-level string Set the logging level ("debug", "info", "warn", "error", "fatal") (default "info") --tls Use TLS; implied by --tlsverify --tlscacert string Trust certs signed only by this CA (default "/home/crazy/.docker/ca.pem") --tlscert string Path to TLS certificate file (default "/home/crazy/.docker/cert.pem") --tlskey string Path to TLS key file (default "/home/crazy/.docker/key.pem") --tlsverify Use TLS and verify the remote -v, --version Print version information and quitRun 'docker COMMAND --help' for more information on a command.For more help on how to use Docker, head to https://docs.docker.com/go/guides/EOL
count=0
whiletruedo
count=$((count+1))$1 --config /tmp/plugin-test-163662627 nonexistent -h 1>"$output/std-$count.out"2>"$output/std-$count.err"if! cmp -s "$output/orig.txt""$output/std-$count.out";thenecho"Test $count: FAIL"
diff "$output/orig.txt""$output/std-$count.out"exit 1
fiecho"Test $count: OK"done
$ make -f docker.Makefile binary
...
$ /tmp/help-race.sh $(pwd)/build/docker
Output: /tmp/cli-output.De8S3dhjgQ
Test 1: OK
Test 2: OK
Test 3: OK
Test 4: OK
Test 5: OK
Test 6: OK
Test 7: OK
Test 8: OK
Test 9: OK
Test 10: OK
Test 11: OK
Test 12: OK
Test 13: OK
Test 14: OK
Test 15: OK
Test 16: OK
Test 17: OK
Test 18: OK
Test 19: OK
Test 20: OK
Test 21: OK
Test 22: OK
Test 23: OK
Test 24: OK
Test 25: OK
Test 26: OK
Test 27: OK
Test 28: OK
Test 29: OK
Test 30: OK
Test 31: OK
Test 32: OK
Test 33: OK
Test 34: OK
Test 35: OK
Test 36: FAIL
76a77
> wait Block until one or more containers stop, then print their exit codes

Expected behavior

No response

docker version

Client:
Version: 23.0.0-130-g1c10101b17.m
API version: 1.41 (downgraded from 1.43)
Go version: go1.20.2
Git commit: 1c10101b17
Built: Fri Mar 31 12:27:59 2023
OS/Arch: linux/amd64
Context: default

docker info

Client:
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc.)
Version: v0.10.0-rc2-175-g10dc9594
Path: /home/crazy/.docker/cli-plugins/docker-buildx
compose: Docker Compose (Docker Inc.)
Version: v2.15.1
Path: /usr/local/lib/docker/cli-plugins/docker-compose
dev: Docker Dev Environments (Docker Inc.)
Version: v0.1.0
Path: /usr/local/lib/docker/cli-plugins/docker-dev
extension: Manages Docker extensions (Docker Inc.)
Version: v0.2.18
Path: /usr/local/lib/docker/cli-plugins/docker-extension
sbom: View the packaged-based Software Bill Of Materials (SBOM) for an image (Anchore Inc.)
Version: 0.6.0
Path: /usr/local/lib/docker/cli-plugins/docker-sbom
scan: Docker Scan (Docker Inc.)
Version: v0.25.0
Path: /usr/local/lib/docker/cli-plugins/docker-scan
scout: Command line tool for Docker Scout (Docker Inc.)
Version: v0.6.0
Path: /usr/local/lib/docker/cli-plugins/docker-scout

Additional Info

No response

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions