github.com/lmars/docker@v1.6.0-rc2/graph/list.go (about) 1 package graph 2 3 import ( 4 "log" 5 "path" 6 "strings" 7 8 "github.com/docker/docker/engine" 9 "github.com/docker/docker/image" 10 "github.com/docker/docker/pkg/parsers/filters" 11 "github.com/docker/docker/utils" 12 ) 13 14 var acceptedImageFilterTags = map[string]struct{}{ 15 "dangling": {}, 16 "label": {}, 17 } 18 19 func (s *TagStore) CmdImages(job *engine.Job) engine.Status { 20 var ( 21 allImages map[string]*image.Image 22 err error 23 filt_tagged = true 24 filt_label = false 25 ) 26 27 imageFilters, err := filters.FromParam(job.Getenv("filters")) 28 if err != nil { 29 return job.Error(err) 30 } 31 for name := range imageFilters { 32 if _, ok := acceptedImageFilterTags[name]; !ok { 33 return job.Errorf("Invalid filter '%s'", name) 34 } 35 } 36 37 if i, ok := imageFilters["dangling"]; ok { 38 for _, value := range i { 39 if strings.ToLower(value) == "true" { 40 filt_tagged = false 41 } 42 } 43 } 44 45 _, filt_label = imageFilters["label"] 46 47 if job.GetenvBool("all") && filt_tagged { 48 allImages, err = s.graph.Map() 49 } else { 50 allImages, err = s.graph.Heads() 51 } 52 if err != nil { 53 return job.Error(err) 54 } 55 lookup := make(map[string]*engine.Env) 56 s.Lock() 57 for repoName, repository := range s.Repositories { 58 if job.Getenv("filter") != "" { 59 if match, _ := path.Match(job.Getenv("filter"), repoName); !match { 60 continue 61 } 62 } 63 for ref, id := range repository { 64 imgRef := utils.ImageReference(repoName, ref) 65 image, err := s.graph.Get(id) 66 if err != nil { 67 log.Printf("Warning: couldn't load %s from %s: %s", id, imgRef, err) 68 continue 69 } 70 71 if out, exists := lookup[id]; exists { 72 if filt_tagged { 73 if utils.DigestReference(ref) { 74 out.SetList("RepoDigests", append(out.GetList("RepoDigests"), imgRef)) 75 } else { // Tag Ref. 76 out.SetList("RepoTags", append(out.GetList("RepoTags"), imgRef)) 77 } 78 } 79 } else { 80 // get the boolean list for if only the untagged images are requested 81 delete(allImages, id) 82 if !imageFilters.MatchKVList("label", image.ContainerConfig.Labels) { 83 continue 84 } 85 if filt_tagged { 86 out := &engine.Env{} 87 out.SetJson("ParentId", image.Parent) 88 out.SetJson("Id", image.ID) 89 out.SetInt64("Created", image.Created.Unix()) 90 out.SetInt64("Size", image.Size) 91 out.SetInt64("VirtualSize", image.GetParentsSize(0)+image.Size) 92 out.SetJson("Labels", image.ContainerConfig.Labels) 93 94 if utils.DigestReference(ref) { 95 out.SetList("RepoTags", []string{}) 96 out.SetList("RepoDigests", []string{imgRef}) 97 } else { 98 out.SetList("RepoTags", []string{imgRef}) 99 out.SetList("RepoDigests", []string{}) 100 } 101 102 lookup[id] = out 103 } 104 } 105 106 } 107 } 108 s.Unlock() 109 110 outs := engine.NewTable("Created", len(lookup)) 111 for _, value := range lookup { 112 outs.Add(value) 113 } 114 115 // Display images which aren't part of a repository/tag 116 if job.Getenv("filter") == "" || filt_label { 117 for _, image := range allImages { 118 if !imageFilters.MatchKVList("label", image.ContainerConfig.Labels) { 119 continue 120 } 121 out := &engine.Env{} 122 out.SetJson("ParentId", image.Parent) 123 out.SetList("RepoTags", []string{"<none>:<none>"}) 124 out.SetList("RepoDigests", []string{"<none>@<none>"}) 125 out.SetJson("Id", image.ID) 126 out.SetInt64("Created", image.Created.Unix()) 127 out.SetInt64("Size", image.Size) 128 out.SetInt64("VirtualSize", image.GetParentsSize(0)+image.Size) 129 out.SetJson("Labels", image.ContainerConfig.Labels) 130 outs.Add(out) 131 } 132 } 133 134 outs.ReverseSort() 135 if _, err := outs.WriteListTo(job.Stdout); err != nil { 136 return job.Error(err) 137 } 138 return engine.StatusOK 139 }