407a626be6
Export image/container metadata stored in graph driver. Right now 3 fields DeviceId, DeviceSize and DeviceName are being exported from devicemapper. Other graph drivers can export fields as they see fit. This data can be used to mount the thin device outside of docker and tools can look into image/container and do some kind of inspection. Signed-off-by: Vivek Goyal <vgoyal@redhat.com>
75 lines
1.9 KiB
Go
75 lines
1.9 KiB
Go
package graph
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
|
|
"github.com/Sirupsen/logrus"
|
|
"github.com/docker/docker/api/types"
|
|
)
|
|
|
|
func (s *TagStore) LookupRaw(name string) ([]byte, error) {
|
|
image, err := s.LookupImage(name)
|
|
if err != nil || image == nil {
|
|
return nil, fmt.Errorf("No such image %s", name)
|
|
}
|
|
|
|
imageInspectRaw, err := s.graph.RawJSON(image.ID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return imageInspectRaw, nil
|
|
}
|
|
|
|
// Lookup return an image encoded in JSON
|
|
func (s *TagStore) Lookup(name string) (*types.ImageInspect, error) {
|
|
image, err := s.LookupImage(name)
|
|
if err != nil || image == nil {
|
|
return nil, fmt.Errorf("No such image: %s", name)
|
|
}
|
|
|
|
imageInspect := &types.ImageInspect{
|
|
Id: image.ID,
|
|
Parent: image.Parent,
|
|
Comment: image.Comment,
|
|
Created: image.Created,
|
|
Container: image.Container,
|
|
ContainerConfig: &image.ContainerConfig,
|
|
DockerVersion: image.DockerVersion,
|
|
Author: image.Author,
|
|
Config: image.Config,
|
|
Architecture: image.Architecture,
|
|
Os: image.OS,
|
|
Size: image.Size,
|
|
VirtualSize: s.graph.GetParentsSize(image, 0) + image.Size,
|
|
}
|
|
|
|
imageInspect.GraphDriver.Name = s.graph.driver.String()
|
|
|
|
graphDriverData, err := s.graph.driver.GetMetadata(image.ID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
imageInspect.GraphDriver.Data = graphDriverData
|
|
return imageInspect, nil
|
|
}
|
|
|
|
// ImageTarLayer return the tarLayer of the image
|
|
func (s *TagStore) ImageTarLayer(name string, dest io.Writer) error {
|
|
if image, err := s.LookupImage(name); err == nil && image != nil {
|
|
fs, err := s.graph.TarLayer(image)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer fs.Close()
|
|
|
|
written, err := io.Copy(dest, fs)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
logrus.Debugf("rendered layer for %s of [%d] size", image.ID, written)
|
|
return nil
|
|
}
|
|
return fmt.Errorf("No such image: %s", name)
|
|
}
|