From 4e0c76b321cf42d36cdbedcf84103f4fcc123ecd Mon Sep 17 00:00:00 2001 From: Michael Crosby Date: Wed, 20 Nov 2013 15:37:26 -0800 Subject: [PATCH] Ensure that only the layers are compressed and not mnt points --- graph.go | 2 +- image.go | 23 ++++++++++++++++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/graph.go b/graph.go index f73602727..b08c9cc94 100644 --- a/graph.go +++ b/graph.go @@ -187,7 +187,7 @@ func (graph *Graph) TempLayerArchive(id string, compression archive.Compression, if err != nil { return nil, err } - a, err := image.TarLayer(compression) + a, err := image.TarLayer() if err != nil { return nil, err } diff --git a/image.go b/image.go index 47c4ab2d7..89a78eab8 100644 --- a/image.go +++ b/image.go @@ -144,15 +144,32 @@ func jsonPath(root string) string { } // TarLayer returns a tar archive of the image's filesystem layer. -func (img *Image) TarLayer(compression archive.Compression) (archive.Archive, error) { +func (img *Image) TarLayer() (archive.Archive, error) { if img.graph == nil { return nil, fmt.Errorf("Can't load storage driver for unregistered image %s", img.ID) } - layerPath, err := img.graph.driver.Get(img.ID) + driver := img.graph.driver + if differ, ok := driver.(graphdriver.Differ); ok { + return differ.Diff(img.ID) + } + + imgFs, err := driver.Get(img.ID) if err != nil { return nil, err } - return archive.Tar(layerPath, compression) + if img.Parent == "" { + return archive.Tar(imgFs, archive.Uncompressed) + } else { + parentFs, err := driver.Get(img.Parent) + if err != nil { + return nil, err + } + changes, err := archive.ChangesDirs(imgFs, parentFs) + if err != nil { + return nil, err + } + return archive.ExportChanges(imgFs, changes) + } } func ValidateID(id string) error {