github.com/mheon/docker@v0.11.2-0.20150922122814-44f47903a831/graph/service.go (about) 1 package graph 2 3 import ( 4 "fmt" 5 "io" 6 "runtime" 7 "time" 8 9 "github.com/Sirupsen/logrus" 10 "github.com/docker/docker/api/types" 11 "github.com/docker/docker/utils" 12 ) 13 14 // lookupRaw looks up an image by name in a TagStore and returns the raw JSON 15 // describing the image. 16 func (s *TagStore) lookupRaw(name string) ([]byte, error) { 17 image, err := s.LookupImage(name) 18 if err != nil || image == nil { 19 return nil, fmt.Errorf("No such image %s", name) 20 } 21 22 imageInspectRaw, err := s.graph.RawJSON(image.ID) 23 if err != nil { 24 return nil, err 25 } 26 27 return imageInspectRaw, nil 28 } 29 30 // Lookup looks up an image by name in a TagStore and returns it as an 31 // ImageInspect structure. 32 func (s *TagStore) Lookup(name string) (*types.ImageInspect, error) { 33 image, err := s.LookupImage(name) 34 if err != nil || image == nil { 35 return nil, fmt.Errorf("No such image: %s", name) 36 } 37 38 var tags = make([]string, 0) 39 40 s.Lock() 41 for repoName, repository := range s.Repositories { 42 for ref, id := range repository { 43 if id == image.ID { 44 imgRef := utils.ImageReference(repoName, ref) 45 tags = append(tags, imgRef) 46 } 47 } 48 } 49 s.Unlock() 50 51 imageInspect := &types.ImageInspect{ 52 ID: image.ID, 53 Tags: tags, 54 Parent: image.Parent, 55 Comment: image.Comment, 56 Created: image.Created.Format(time.RFC3339Nano), 57 Container: image.Container, 58 ContainerConfig: &image.ContainerConfig, 59 DockerVersion: image.DockerVersion, 60 Author: image.Author, 61 Config: image.Config, 62 Architecture: image.Architecture, 63 Os: image.OS, 64 Size: image.Size, 65 VirtualSize: s.graph.GetParentsSize(image) + image.Size, 66 } 67 68 imageInspect.GraphDriver.Name = s.graph.driver.String() 69 70 graphDriverData, err := s.graph.driver.GetMetadata(image.ID) 71 if err != nil { 72 return nil, err 73 } 74 imageInspect.GraphDriver.Data = graphDriverData 75 return imageInspect, nil 76 } 77 78 // ImageTarLayer return the tarLayer of the image 79 func (s *TagStore) ImageTarLayer(name string, dest io.Writer) error { 80 if image, err := s.LookupImage(name); err == nil && image != nil { 81 // On Windows, the base layer cannot be exported 82 if runtime.GOOS != "windows" || image.Parent != "" { 83 84 fs, err := s.graph.TarLayer(image) 85 if err != nil { 86 return err 87 } 88 defer fs.Close() 89 90 written, err := io.Copy(dest, fs) 91 if err != nil { 92 return err 93 } 94 logrus.Debugf("rendered layer for %s of [%d] size", image.ID, written) 95 } 96 return nil 97 } 98 return fmt.Errorf("No such image: %s", name) 99 }