From 910418adbc5f775b0b2016bc9c650d1b6eb868c8 Mon Sep 17 00:00:00 2001 From: Vincent Batts Date: Sat, 20 Jun 2015 10:14:24 -0400 Subject: [PATCH] graph: preserve tar archive entries Preserve the entries from the tar archive for layers added to the graph. With these entries and relative filesystem path, the tar archives can be reassembled later. Signed-off-by: Vincent Batts Upstream-commit: 5d9f06599c4f0cde9ad266dff77e797ea99c3ac3 Component: engine --- components/engine/graph/graph_unix.go | 25 ++++++++++++++++++++++- components/engine/graph/graph_windows.go | 26 +++++++++++++++++++++++- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/components/engine/graph/graph_unix.go b/components/engine/graph/graph_unix.go index e42eb9bb36..cd48cf0cdf 100644 --- a/components/engine/graph/graph_unix.go +++ b/components/engine/graph/graph_unix.go @@ -3,6 +3,7 @@ package graph import ( + "compress/gzip" "encoding/json" "fmt" "os" @@ -90,7 +91,29 @@ func (graph *Graph) restoreBaseImages() ([]string, error) { func (graph *Graph) storeImage(img *image.Image, layerData archive.ArchiveReader, root string) (err error) { // Store the layer. If layerData is not nil, unpack it into the new layer if layerData != nil { - if img.Size, err = graph.driver.ApplyDiff(img.ID, img.Parent, layerData); err != nil { + // this is saving the tar-split metadata + mf, err := os.OpenFile(filepath.Join(root, "tar-data.json.gz"), os.O_CREATE|os.O_WRONLY|os.O_TRUNC, os.FileMode(0600)) + if err != nil { + return err + } + defer mf.Close() + mfz := gzip.NewWriter(mf) + defer mfz.Close() + metaPacker := storage.NewJSONPacker(mf) + + inflatedLayerData, err := archive.DecompressStream(layerData) + if err != nil { + return err + } + + // we're passing nil here for the file putter, because the ApplyDiff will + // handle the extraction of the archive + its, err := asm.NewInputTarStream(inflatedLayerData, metaPacker, nil) + if err != nil { + return err + } + + if img.Size, err = graph.driver.ApplyDiff(img.ID, img.Parent, archive.ArchiveReader(its)); err != nil { return err } } diff --git a/components/engine/graph/graph_windows.go b/components/engine/graph/graph_windows.go index 2904f9b9f8..9a058aa54c 100644 --- a/components/engine/graph/graph_windows.go +++ b/components/engine/graph/graph_windows.go @@ -3,9 +3,11 @@ package graph import ( + "compress/gzip" "encoding/json" "fmt" "os" + "path/filepath" "github.com/Sirupsen/logrus" "github.com/docker/docker/daemon/graphdriver/windows" @@ -115,7 +117,29 @@ func (graph *Graph) storeImage(img *image.Image, layerData archive.ArchiveReader // Store the layer. If layerData is not nil, unpack it into the new layer if layerData != nil { - if img.Size, err = graph.driver.ApplyDiff(img.ID, img.Parent, layerData); err != nil { + // this is saving the tar-split metadata + mf, err := os.OpenFile(filepath.Join(root, "tar-data.json.gz"), os.O_CREATE|os.O_WRONLY|os.O_TRUNC, os.FileMode(0600)) + if err != nil { + return err + } + defer mf.Close() + mfz := gzip.NewWriter(mf) + defer mfz.Close() + metaPacker := storage.NewJSONPacker(mf) + + inflatedLayerData, err := archive.DecompressStream(layerData) + if err != nil { + return err + } + + // we're passing nil here for the file putter, because the ApplyDiff will + // handle the extraction of the archive + its, err := asm.NewInputTarStream(inflatedLayerData, metaPacker, nil) + if err != nil { + return err + } + + if img.Size, err = graph.driver.ApplyDiff(img.ID, img.Parent, archive.ArchiveReader(its)); err != nil { return err } }