mirror of https://github.com/docker/cli.git
Merge eea706f6f4
into a4228409d2
This commit is contained in:
commit
2416337158
|
@ -12,6 +12,7 @@ import (
|
||||||
"github.com/docker/cli/cli/command/completion"
|
"github.com/docker/cli/cli/command/completion"
|
||||||
"github.com/docker/cli/opts"
|
"github.com/docker/cli/opts"
|
||||||
"github.com/docker/docker/api/types/container"
|
"github.com/docker/docker/api/types/container"
|
||||||
|
"github.com/docker/docker/api/types/hub"
|
||||||
"github.com/moby/sys/signal"
|
"github.com/moby/sys/signal"
|
||||||
"github.com/moby/term"
|
"github.com/moby/term"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
@ -37,13 +38,74 @@ func NewRunCommand(dockerCli command.Cli) *cobra.Command {
|
||||||
Short: "Create and run a new container from an image",
|
Short: "Create and run a new container from an image",
|
||||||
Args: cli.RequiresMinArgs(1),
|
Args: cli.RequiresMinArgs(1),
|
||||||
RunE: func(cmd *cobra.Command, args []string) error {
|
RunE: func(cmd *cobra.Command, args []string) error {
|
||||||
copts.Image = args[0]
|
replacer := strings.NewReplacer("(local)", "", "(remote)", "")
|
||||||
|
copts.Image = replacer.Replace(args[0])
|
||||||
if len(args) > 1 {
|
if len(args) > 1 {
|
||||||
copts.Args = args[1:]
|
copts.Args = args[1:]
|
||||||
}
|
}
|
||||||
return runRun(cmd.Context(), dockerCli, cmd.Flags(), &options, copts)
|
return runRun(cmd.Context(), dockerCli, cmd.Flags(), &options, copts)
|
||||||
},
|
},
|
||||||
ValidArgsFunction: completion.ImageNames(dockerCli),
|
ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
|
||||||
|
if len(args) > 0 {
|
||||||
|
return nil, cobra.ShellCompDirectiveNoFileComp
|
||||||
|
}
|
||||||
|
|
||||||
|
unique := map[string]struct{}{}
|
||||||
|
localImages, shellComp := completion.ImageNames(dockerCli)(cmd, args, toComplete)
|
||||||
|
|
||||||
|
var all []string
|
||||||
|
if shellComp != cobra.ShellCompDirectiveError {
|
||||||
|
all = make([]string, 0, len(localImages))
|
||||||
|
for _, img := range localImages {
|
||||||
|
unique[img] = struct{}{}
|
||||||
|
all = append(all, img+"\tlocal")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if image, tag, found := strings.Cut(toComplete, ":"); found {
|
||||||
|
remoteTags, err := dockerCli.Client().HubImageTags(cmd.Context(), image, hub.ImageOptions{
|
||||||
|
Name: tag,
|
||||||
|
Ordering: "last_updated",
|
||||||
|
Page: 0,
|
||||||
|
PageSize: 25,
|
||||||
|
})
|
||||||
|
if err == nil {
|
||||||
|
if len(all) == 0 {
|
||||||
|
all = make([]string, 0, len(remoteTags.Results))
|
||||||
|
}
|
||||||
|
for _, tag := range remoteTags.Results {
|
||||||
|
fullName := image + ":" + tag.Name
|
||||||
|
if _, ok := unique[fullName]; !ok {
|
||||||
|
all = append(all, fullName+"\tremote")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return all, cobra.ShellCompDirectiveKeepOrder | cobra.ShellCompDirectiveNoFileComp
|
||||||
|
}
|
||||||
|
|
||||||
|
remoteImages, err := dockerCli.Client().HubImageSearch(cmd.Context(), toComplete, hub.SearchOptions{
|
||||||
|
From: 0,
|
||||||
|
Size: 25,
|
||||||
|
Type: hub.SearchTypeImage,
|
||||||
|
Order: hub.SearchOrderDesc,
|
||||||
|
Official: true,
|
||||||
|
Source: hub.SearchSourceStore,
|
||||||
|
OpenSource: true,
|
||||||
|
ExtensionReviewed: true,
|
||||||
|
})
|
||||||
|
if err == nil {
|
||||||
|
if len(all) == 0 {
|
||||||
|
all = make([]string, 0, len(remoteImages.Results))
|
||||||
|
}
|
||||||
|
for _, img := range remoteImages.Results {
|
||||||
|
if _, ok := unique[img.Name]; !ok {
|
||||||
|
all = append(all, img.Name+"\tremote")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return all, cobra.ShellCompDirectiveKeepOrder | cobra.ShellCompDirectiveNoFileComp
|
||||||
|
},
|
||||||
Annotations: map[string]string{
|
Annotations: map[string]string{
|
||||||
"category-top": "1",
|
"category-top": "1",
|
||||||
"aliases": "docker container run, docker run",
|
"aliases": "docker container run, docker run",
|
||||||
|
|
|
@ -10,6 +10,7 @@ import (
|
||||||
"github.com/docker/cli/cli/command"
|
"github.com/docker/cli/cli/command"
|
||||||
"github.com/docker/cli/cli/command/completion"
|
"github.com/docker/cli/cli/command/completion"
|
||||||
"github.com/docker/cli/cli/trust"
|
"github.com/docker/cli/cli/trust"
|
||||||
|
"github.com/docker/docker/api/types/hub"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
@ -39,7 +40,55 @@ func NewPullCommand(dockerCli command.Cli) *cobra.Command {
|
||||||
"category-top": "5",
|
"category-top": "5",
|
||||||
"aliases": "docker image pull, docker pull",
|
"aliases": "docker image pull, docker pull",
|
||||||
},
|
},
|
||||||
ValidArgsFunction: completion.NoComplete,
|
ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
|
||||||
|
if len(args) > 0 {
|
||||||
|
return nil, cobra.ShellCompDirectiveNoFileComp
|
||||||
|
}
|
||||||
|
|
||||||
|
if image, tag, found := strings.Cut(toComplete, ":"); found {
|
||||||
|
remoteTags, err := dockerCli.Client().HubImageTags(cmd.Context(), image, hub.ImageOptions{
|
||||||
|
Name: tag,
|
||||||
|
Ordering: "last_updated",
|
||||||
|
Page: 0,
|
||||||
|
PageSize: 25,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, cobra.ShellCompDirectiveError
|
||||||
|
}
|
||||||
|
|
||||||
|
images := make([]string, 0, len(remoteTags.Results))
|
||||||
|
for _, tag := range remoteTags.Results {
|
||||||
|
fullName := image + ":" + tag.Name
|
||||||
|
images = append(images, fullName+"\t"+tag.LastUpdated.String())
|
||||||
|
}
|
||||||
|
return images, cobra.ShellCompDirectiveKeepOrder | cobra.ShellCompDirectiveNoFileComp
|
||||||
|
}
|
||||||
|
|
||||||
|
remoteImages, err := dockerCli.Client().HubImageSearch(cmd.Context(), toComplete, hub.SearchOptions{
|
||||||
|
From: 0,
|
||||||
|
Size: 25,
|
||||||
|
Type: hub.SearchTypeImage,
|
||||||
|
Order: hub.SearchOrderDesc,
|
||||||
|
Official: true,
|
||||||
|
Source: hub.SearchSourceStore,
|
||||||
|
OpenSource: true,
|
||||||
|
ExtensionReviewed: true,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, cobra.ShellCompDirectiveError
|
||||||
|
}
|
||||||
|
|
||||||
|
images := make([]string, 0, len(remoteImages.Results))
|
||||||
|
for _, img := range remoteImages.Results {
|
||||||
|
categories := make([]string, 0, len(img.Categories))
|
||||||
|
for _, cat := range img.Categories {
|
||||||
|
categories = append(categories, cat.Name)
|
||||||
|
}
|
||||||
|
images = append(images, img.Name+"\t"+strings.Join(categories, ", "))
|
||||||
|
}
|
||||||
|
|
||||||
|
return images, cobra.ShellCompDirectiveKeepOrder | cobra.ShellCompDirectiveNoFileComp
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
flags := cmd.Flags()
|
flags := cmd.Flags()
|
||||||
|
|
|
@ -92,7 +92,7 @@ func newDockerCommand(dockerCli *command.DockerCli) *cli.TopLevelCommand {
|
||||||
CompletionOptions: cobra.CompletionOptions{
|
CompletionOptions: cobra.CompletionOptions{
|
||||||
DisableDefaultCmd: false,
|
DisableDefaultCmd: false,
|
||||||
HiddenDefaultCmd: true,
|
HiddenDefaultCmd: true,
|
||||||
DisableDescriptions: true,
|
DisableDescriptions: false,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
cmd.SetIn(dockerCli.In())
|
cmd.SetIn(dockerCli.In())
|
||||||
|
|
Loading…
Reference in New Issue