cli
cli copied to clipboard
Shell completion for images is not working
Description
The shell completion generated by docker completion
doesn't work for images. If I enable completion debugging, by setting the
BASH_COMP_DEBUG_FILE environment variable, I get the following information:
========= starting completion logic ==========
CURRENT: 3, words[*]: docker rmi
Truncated words[*]: docker rmi ,
lastParam: , lastChar:
Adding extra empty parameter
About to call: eval docker __completeNoDesc rmi ""
completion output: :0
last line: :0
directive: 0
completions:
flagPrefix:
Calling _describe
_describe did not find completions.
Checking if we should do file completion.
Activating file completion
We can see that the command docker __completeNoDesc rmi ""
is being called, and that command always returns the following:
$ docker __completeNoDesc rmi ""
:0
Completion ended with directive: ShellCompDirectiveDefault
By comparison, docker __completeNoDesc run ""
does list the available images:
$ docker __completeNoDesc run ""
alpine:latest
:4
Completion ended with directive: ShellCompDirectiveNoFileComp
This issue can be worked around by using the completion files found in the contrib folder of this repository. Doing this however breaks the auto completion for docker compose
, which is why the official Arch Linux package has stopped using it.
Reproduce
- Have at least one image available
- Ensure you are using the completion generated from docker completion:
source <(docker completion <your shell here>)
-
docker rmi <TAB>
Expected behavior
The shell completion should suggest a list of available images. Instead, it shows the files in the current directory.
docker version
Client:
Version: 24.0.5
API version: 1.43
Go version: go1.20.6
Git commit: ced0996600
Built: Wed Jul 26 21:44:58 2023
OS/Arch: linux/amd64
Context: default
Server:
Engine:
Version: 24.0.5
API version: 1.43 (minimum version 1.12)
Go version: go1.20.6
Git commit: a61e2b4c9c
Built: Wed Jul 26 21:44:58 2023
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: v1.7.6
GitCommit: 091922f03c2762540fd057fba91260237ff86acb.m
runc:
Version: 1.1.9
GitCommit:
docker-init:
Version: 0.19.0
GitCommit: de40ad0
docker info
Client:
Version: 24.0.5
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc.)
Version: 0.11.2
Path: /usr/lib/docker/cli-plugins/docker-buildx
compose: Docker Compose (Docker Inc.)
Version: 2.20.3
Path: /usr/lib/docker/cli-plugins/docker-compose
Server:
Containers: 1
Running: 1
Paused: 0
Stopped: 0
Images: 27
Server Version: 24.0.5
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Using metacopy: true
Native Overlay Diff: false
userxattr: false
Logging Driver: json-file
Cgroup Driver: systemd
Cgroup Version: 2
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: io.containerd.runc.v2 runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 091922f03c2762540fd057fba91260237ff86acb.m
runc version:
init version: de40ad0
Security Options:
seccomp
Profile: builtin
cgroupns
Kernel Version: 6.5.5-arch1-1
Operating System: Arch Linux
OSType: linux
Architecture: x86_64
CPUs: 12
Total Memory: 31.27GiB
Name: ragnarok
ID: O7FG:KKYF:CPWV:KSVB:NL4B:AUKS:4I6N:EEKZ:MXAV:R2ZZ:YLB6:EBRY
Docker Root Dir: /var/lib/docker
Debug Mode: false
Username: acidrain
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
Additional Info
No response
Hi @mathieu-lemay, Here's a quick fix for you, I think you are able to rebuild the docker package from arch yourself.
--- a/cli/command/image/remove.go
+++ b/cli/command/image/remove.go
@@ -7,6 +7,7 @@ import (
"github.com/docker/cli/cli"
"github.com/docker/cli/cli/command"
+ "github.com/docker/cli/cli/command/completion"
"github.com/docker/docker/api/types"
apiclient "github.com/docker/docker/client"
"github.com/pkg/errors"
@@ -32,6 +33,7 @@ func NewRemoveCommand(dockerCli command.Cli) *cobra.Command {
Annotations: map[string]string{
"aliases": "docker image rm, docker image remove, docker rmi",
},
+ ValidArgsFunction: completion.ImageNames(dockerCli),
}
flags := cmd.Flags()
@vitoyucepi Thank you! It works perfectly fine. I've applied the fix in cli/command/image/inspect.go
also.
latest docker rootless by script (curl -fsSL https://get.docker.com/rootless | sh) image completion not work 's
docker version
Client:
Version: 25.0.0
API version: 1.44
Go version: go1.21.6
Git commit: e758fe5
Built: Thu Jan 18 17:09:01 2024
OS/Arch: linux/amd64
it seems to be a behavior of the engine in rootless mode, because using the alpine:edge binary (Git commit: afdd53b4e341be38d2056a42113b938559bb1d94), consuming the socket (docker run -v socket:socket, etc) also does not support completion for images.