func showCommand(c *cli.Context) { dockerClient, err := dockerclient.NewFromCli(c) if err != nil { log.Fatal(err) } // Initialize context dir args := c.Args() if len(args) == 0 { log.Fatal("Missing image argument") } //parse parameter to name imageName := imagename.NewFromString(args[0]) infos := []*build.RockerImageData{} if imageName.IsStrict() { image, err := dockerClient.InspectImage(args[0]) if err != nil && err.Error() == "no such image" { image, err = imagename.RegistryGet(imageName) if err != nil { log.Fatal(err) } } else if err != nil { log.Fatal(err) } info, err := toInfo(imageName, image) if err != nil { log.Fatal(err) } infos = append(infos, info) } else { images, err := imagename.RegistryListTags(imageName) if err != nil { log.Fatal(err) } type resp struct { name *imagename.ImageName image *docker.Image err error } chResp := make(chan resp, len(images)) for _, img := range images { go func(img *imagename.ImageName) { r := resp{name: img} r.image, r.err = imagename.RegistryGet(img) chResp <- r }(img) } for _ = range images { r := <-chResp if r.err != nil { log.Println(r.err) } else if info, err := toInfo(r.name, r.image); err == nil { infos = append(infos, info) } } } if c.Bool("json") { res, err := json.Marshal(infos) if err != nil { log.Fatal(err) } fmt.Println(string(res)) } else { for _, res := range infos { fmt.Println(res.PrettyString()) } } }
// ListImageTags returns the list of images instances obtained from all tags existing in the registry func (c *DockerClient) ListImageTags(name string) (images []*imagename.ImageName, err error) { return imagename.RegistryListTags(imagename.NewFromString(name)) }