diff --git a/container.go b/container.go index bac0951da4..891ae750ae 100644 --- a/container.go +++ b/container.go @@ -1,6 +1,7 @@ package docker import ( + "crypto/sha256" "encoding/json" "fmt" "github.com/dotcloud/docker/rcli" @@ -695,6 +696,18 @@ func (container *Container) ExportRw() (Archive, error) { return Tar(container.rwPath(), Uncompressed) } +func (container *Container) RwChecksum() (string, error) { + h := sha256.New() + rwData, err := container.ExportRw() + if err != nil { + return "", err + } + if _, err := io.Copy(h, rwData); err != nil { + return "", err + } + return string(h.Sum(nil)), nil +} + func (container *Container) Export() (Archive, error) { if err := container.EnsureMounted(); err != nil { return nil, err diff --git a/graph.go b/graph.go index ea0c42b3d2..59a8cba8db 100644 --- a/graph.go +++ b/graph.go @@ -98,11 +98,13 @@ func (graph *Graph) Create(layerData Archive, container *Container, comment, aut img.Parent = container.Image img.Container = container.Id img.ContainerConfig = *container.Config - if config == nil { - if parentImage, err := graph.Get(container.Image); err == nil && parentImage != nil { - img.Config = parentImage.Config - } + // FIXME: If an image is pulled from a raw URL (not created from a container), + // its checksum will not be computed, which will cause a push to fail + checksum, err := container.RwChecksum() + if err != nil { + return nil, err } + img.Checksum = checksum } if err := graph.Register(layerData, img); err != nil { return nil, err diff --git a/image.go b/image.go index 09c0f8dcf6..8090e583e6 100644 --- a/image.go +++ b/image.go @@ -18,6 +18,7 @@ import ( type Image struct { Id string `json:"id"` Parent string `json:"parent,omitempty"` + Checksum string `json:"checksum,omitempty"` Comment string `json:"comment,omitempty"` Created time.Time `json:"created"` Container string `json:"container,omitempty"`