Merge pull request #433 from kolyshkin/17.12-backport-layer-not-retained

[17.12] backport layer not retained
This commit is contained in:
Andrew Hsu
2018-02-21 09:50:26 -08:00
committed by GitHub
6 changed files with 61 additions and 3 deletions
+3
View File
@@ -22,6 +22,9 @@ func (daemon *Daemon) ContainerChanges(name string) ([]archive.Change, error) {
container.Lock()
defer container.Unlock()
if container.RWLayer == nil {
return nil, errors.New("RWLayer of container " + name + " is unexpectedly nil")
}
c, err := container.RWLayer.Changes()
if err != nil {
return nil, err
+6
View File
@@ -1056,6 +1056,9 @@ func (daemon *Daemon) Shutdown() error {
// Mount sets container.BaseFS
// (is it not set coming in? why is it unset?)
func (daemon *Daemon) Mount(container *container.Container) error {
if container.RWLayer == nil {
return errors.New("RWLayer of container " + container.ID + " is unexpectedly nil")
}
dir, err := container.RWLayer.Mount(container.GetMountLabel())
if err != nil {
return err
@@ -1078,6 +1081,9 @@ func (daemon *Daemon) Mount(container *container.Container) error {
// Unmount unsets the container base filesystem
func (daemon *Daemon) Unmount(container *container.Container) error {
if container.RWLayer == nil {
return errors.New("RWLayer of container " + container.ID + " is unexpectedly nil")
}
if err := container.RWLayer.Unmount(); err != nil {
logrus.Errorf("Error unmounting container %s: %s", container.ID, err)
return err
+1
View File
@@ -124,6 +124,7 @@ func (daemon *Daemon) cleanupContainer(container *container.Container, forceRemo
container.SetRemovalError(e)
return e
}
container.RWLayer = nil
}
if err := system.EnsureRemoveAll(container.Root); err != nil {
+14 -3
View File
@@ -1,6 +1,7 @@
package daemon
import (
"errors"
"fmt"
"time"
@@ -183,14 +184,24 @@ func (daemon *Daemon) getInspectData(container *container.Container) (*types.Con
contJSONBase.GraphDriver.Name = container.Driver
if container.RWLayer == nil {
if container.Dead {
return contJSONBase, nil
}
return nil, systemError{errors.New("RWLayer of container " + container.ID + " is unexpectedly nil")}
}
graphDriverData, err := container.RWLayer.Metadata()
// If container is marked as Dead, the container's graphdriver metadata
// could have been removed, it will cause error if we try to get the metadata,
// we can ignore the error if the container is dead.
if err != nil && !container.Dead {
return nil, systemError{err}
if err != nil {
if !container.Dead {
return nil, systemError{err}
}
} else {
contJSONBase.GraphDriver.Data = graphDriverData
}
contJSONBase.GraphDriver.Data = graphDriverData
return contJSONBase, nil
}
+33
View File
@@ -0,0 +1,33 @@
package daemon // import "github.com/docker/docker/daemon"
import (
"testing"
containertypes "github.com/docker/docker/api/types/container"
"github.com/docker/docker/container"
"github.com/docker/docker/daemon/config"
"github.com/docker/docker/daemon/exec"
"github.com/stretchr/testify/assert"
)
func TestGetInspectData(t *testing.T) {
c := &container.Container{
ID: "inspect-me",
HostConfig: &containertypes.HostConfig{},
State: container.NewState(),
ExecCommands: exec.NewStore(),
}
d := &Daemon{
linkIndex: newLinkIndex(),
configStore: &config.Config{},
}
_, err := d.getInspectData(c)
assert.Error(t, err)
c.Dead = true
_, err = d.getInspectData(c)
assert.NoError(t, err)
}
+4
View File
@@ -1,6 +1,7 @@
package daemon
import (
"errors"
"fmt"
"io/ioutil"
"path/filepath"
@@ -145,6 +146,9 @@ func (daemon *Daemon) createSpec(c *container.Container) (*specs.Spec, error) {
// 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()
if err != nil {
return nil, fmt.Errorf("failed to get layer metadata - %s", err)