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  }