From f6639cb46d83cb9bb92a30578c10fdb372a58f04 Mon Sep 17 00:00:00 2001 From: Daniel Nephin Date: Wed, 21 Feb 2018 17:16:57 -0500 Subject: [PATCH] GetLayerFolders Signed-off-by: Daniel Nephin --- daemon/image_prune.go | 2 +- daemon/image_windows.go | 35 +++++++++++++++++++++++++++++++++++ daemon/oci_windows.go | 26 +++----------------------- 3 files changed, 39 insertions(+), 24 deletions(-) create mode 100644 daemon/image_windows.go diff --git a/daemon/image_prune.go b/daemon/image_prune.go index 8a1c2cd225..193c3aa0ac 100644 --- a/daemon/image_prune.go +++ b/daemon/image_prune.go @@ -1,4 +1,4 @@ -package daemon +package daemon // import "github.com/docker/docker/daemon" import ( "sync/atomic" diff --git a/daemon/image_windows.go b/daemon/image_windows.go new file mode 100644 index 0000000000..d661400a38 --- /dev/null +++ b/daemon/image_windows.go @@ -0,0 +1,35 @@ +package daemon // import "github.com/docker/docker/daemon" + +import ( + "github.com/docker/docker/image" + "github.com/docker/docker/layer" + "github.com/docker/docker/pkg/system" + "github.com/pkg/errors" +) + +// GetLayerFolders returns the layer folders from an image RootFS +func (daemon *Daemon) GetLayerFolders(img *image.Image, rwLayer layer.RWLayer) ([]string, error) { + folders := []string{} + max := len(img.RootFS.DiffIDs) + for index := 1; index <= max; index++ { + // FIXME: why does this mutate the RootFS? + img.RootFS.DiffIDs = img.RootFS.DiffIDs[:index] + if !system.IsOSSupported(img.OperatingSystem()) { + return nil, errors.Wrapf(system.ErrNotSupportedOperatingSystem, "cannot get layerpath for ImageID %s", img.RootFS.ChainID()) + } + layerPath, err := layer.GetLayerPath(daemon.layerStores[img.OperatingSystem()], img.RootFS.ChainID()) + if err != nil { + return nil, errors.Wrapf(err, "failed to get layer path from graphdriver %s for ImageID %s", daemon.layerStores[img.OperatingSystem()], img.RootFS.ChainID()) + } + // Reverse order, expecting parent first + folders = append([]string{layerPath}, folders...) + } + if rwLayer == nil { + return nil, errors.New("RWLayer is unexpectedly nil") + } + m, err := rwLayer.Metadata() + if err != nil { + return nil, errors.Wrap(err, "failed to get layer metadata") + } + return append(folders, m["dir"]), nil +} diff --git a/daemon/oci_windows.go b/daemon/oci_windows.go index 64c651c4af..e4b536f4e4 100644 --- a/daemon/oci_windows.go +++ b/daemon/oci_windows.go @@ -1,7 +1,6 @@ package daemon // import "github.com/docker/docker/daemon" import ( - "errors" "fmt" "io/ioutil" "path/filepath" @@ -10,11 +9,11 @@ import ( containertypes "github.com/docker/docker/api/types/container" "github.com/docker/docker/container" - "github.com/docker/docker/layer" "github.com/docker/docker/oci" "github.com/docker/docker/pkg/sysinfo" "github.com/docker/docker/pkg/system" "github.com/opencontainers/runtime-spec/specs-go" + "github.com/pkg/errors" "golang.org/x/sys/windows" "golang.org/x/sys/windows/registry" ) @@ -139,29 +138,10 @@ func (daemon *Daemon) createSpec(c *container.Container) (*specs.Spec, error) { } } s.Process.User.Username = c.Config.User - - // Get the layer path for each layer. - max := len(img.RootFS.DiffIDs) - for i := 1; i <= max; i++ { - img.RootFS.DiffIDs = img.RootFS.DiffIDs[:i] - if !system.IsOSSupported(img.OperatingSystem()) { - return nil, fmt.Errorf("cannot get layerpath for ImageID %s: %s ", img.RootFS.ChainID(), system.ErrNotSupportedOperatingSystem) - } - layerPath, err := layer.GetLayerPath(daemon.layerStores[img.OperatingSystem()], img.RootFS.ChainID()) - if err != nil { - return nil, fmt.Errorf("failed to get layer path from graphdriver %s for ImageID %s - %s", daemon.layerStores[img.OperatingSystem()], img.RootFS.ChainID(), err) - } - // Reverse order, expecting parent most first - s.Windows.LayerFolders = append([]string{layerPath}, s.Windows.LayerFolders...) - } - if c.RWLayer == nil { - return nil, errors.New("RWLayer of container " + c.ID + " is unexpectedly nil") - } - m, err := c.RWLayer.Metadata() + s.Windows.LayerFolders, err = daemon.GetLayerFolders(img, c.RWLayer) if err != nil { - return nil, fmt.Errorf("failed to get layer metadata - %s", err) + return nil, errors.Wrapf(err, "container %s", c.ID) } - s.Windows.LayerFolders = append(s.Windows.LayerFolders, m["dir"]) dnsSearch := daemon.getDNSSearchSettings(c)