mirror of
https://github.com/clearlinux/docker.git
synced 2026-09-04 20:51:44 +00:00
Generate a hash chain involving the image configuration, layer digests, and parent image hashes. Use the digests to compute IDs for each image in a manifest, instead of using the remotely specified IDs. To avoid breaking users' caches, check for images already in the graph under old IDs, and avoid repulling an image if the version on disk under the legacy ID ends up with the same digest that was computed from the manifest for that image. When a calculated ID already exists in the graph but can't be verified, continue trying SHA256(digest) until a suitable ID is found. "save" and "load" are not changed to use a similar scheme. "load" will preserve the IDs present in the tar file. Signed-off-by: Aaron Lehmann <aaron.lehmann@docker.com>
68 lines
1.7 KiB
Go
68 lines
1.7 KiB
Go
package graph
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"runtime"
|
|
"time"
|
|
|
|
"github.com/Sirupsen/logrus"
|
|
"github.com/docker/docker/api/types"
|
|
)
|
|
|
|
// 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.Format(time.RFC3339Nano),
|
|
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 {
|
|
// On Windows, the base layer cannot be exported
|
|
if runtime.GOOS != "windows" || image.Parent != "" {
|
|
|
|
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)
|
|
}
|