github.com/mephux/docker@v1.6.0-rc5/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  }