Carry 21716: When container had no layer data, cleanupContainer crashed
| ... | ... |
@@ -123,10 +123,14 @@ func (daemon *Daemon) cleanupContainer(container *container.Container, forceRemo |
| 123 | 123 |
return fmt.Errorf("Unable to remove filesystem for %v: %v", container.ID, err)
|
| 124 | 124 |
} |
| 125 | 125 |
|
| 126 |
- metadata, err := daemon.layerStore.ReleaseRWLayer(container.RWLayer) |
|
| 127 |
- layer.LogReleaseMetadata(metadata) |
|
| 128 |
- if err != nil && err != layer.ErrMountDoesNotExist {
|
|
| 129 |
- return fmt.Errorf("Driver %s failed to remove root filesystem %s: %s", daemon.GraphDriverName(), container.ID, err)
|
|
| 126 |
+ // When container creation fails and `RWLayer` has not been created yet, we |
|
| 127 |
+ // do not call `ReleaseRWLayer` |
|
| 128 |
+ if container.RWLayer != nil {
|
|
| 129 |
+ metadata, err := daemon.layerStore.ReleaseRWLayer(container.RWLayer) |
|
| 130 |
+ layer.LogReleaseMetadata(metadata) |
|
| 131 |
+ if err != nil && err != layer.ErrMountDoesNotExist {
|
|
| 132 |
+ return fmt.Errorf("Driver %s failed to remove root filesystem %s: %s", daemon.GraphDriverName(), container.ID, err)
|
|
| 133 |
+ } |
|
| 130 | 134 |
} |
| 131 | 135 |
|
| 132 | 136 |
return nil |
| ... | ... |
@@ -68,15 +68,15 @@ func (s *DockerSuite) TestCreateGrowRootfs(c *check.C) {
|
| 68 | 68 |
cleanedContainerID := strings.TrimSpace(out) |
| 69 | 69 |
|
| 70 | 70 |
inspectOut := inspectField(c, cleanedContainerID, "HostConfig.StorageOpt") |
| 71 |
- c.Assert(inspectOut, checker.Equals, "[size=120G]") |
|
| 71 |
+ c.Assert(inspectOut, checker.Equals, "map[size:120G]") |
|
| 72 | 72 |
} |
| 73 | 73 |
|
| 74 | 74 |
// Make sure we cannot shrink the container's rootfs at creation time. |
| 75 | 75 |
func (s *DockerSuite) TestCreateShrinkRootfs(c *check.C) {
|
| 76 | 76 |
testRequires(c, Devicemapper) |
| 77 | 77 |
|
| 78 |
- // Ensure this fails |
|
| 79 |
- out, _, err := dockerCmdWithError("create", "--storage-opt", "size=80G", "busybox")
|
|
| 78 |
+ // Ensure this fails because of the defaultBaseFsSize is 10G |
|
| 79 |
+ out, _, err := dockerCmdWithError("create", "--storage-opt", "size=5G", "busybox")
|
|
| 80 | 80 |
c.Assert(err, check.NotNil, check.Commentf(out)) |
| 81 | 81 |
c.Assert(out, checker.Contains, "Container size cannot be smaller than") |
| 82 | 82 |
} |
| ... | ... |
@@ -54,6 +54,11 @@ var ( |
| 54 | 54 |
dockerBasePath string |
| 55 | 55 |
volumesConfigPath string |
| 56 | 56 |
containerStoragePath string |
| 57 |
+ |
|
| 58 |
+ // daemonStorageDriver is held globally so that tests can know the storage |
|
| 59 |
+ // driver of the daemon. This is initialized in docker_utils by sending |
|
| 60 |
+ // a version call to the daemon and examining the response header. |
|
| 61 |
+ daemonStorageDriver string |
|
| 57 | 62 |
) |
| 58 | 63 |
|
| 59 | 64 |
const ( |
| ... | ... |
@@ -67,6 +67,7 @@ func init() {
|
| 67 | 67 |
panic(fmt.Errorf("Init failed to unmarshal docker info: %v", err))
|
| 68 | 68 |
} |
| 69 | 69 |
|
| 70 |
+ daemonStorageDriver = info.Driver |
|
| 70 | 71 |
dockerBasePath = info.DockerRootDir |
| 71 | 72 |
volumesConfigPath = filepath.Join(dockerBasePath, "volumes") |
| 72 | 73 |
containerStoragePath = filepath.Join(dockerBasePath, "containers") |
| ... | ... |
@@ -109,22 +109,14 @@ var ( |
| 109 | 109 |
} |
| 110 | 110 |
NotOverlay = testRequirement{
|
| 111 | 111 |
func() bool {
|
| 112 |
- cmd := exec.Command("grep", "^overlay / overlay", "/proc/mounts")
|
|
| 113 |
- if err := cmd.Run(); err != nil {
|
|
| 114 |
- return true |
|
| 115 |
- } |
|
| 116 |
- return false |
|
| 112 |
+ return !strings.HasPrefix(daemonStorageDriver, "overlay") |
|
| 117 | 113 |
}, |
| 118 | 114 |
"Test requires underlying root filesystem not be backed by overlay.", |
| 119 | 115 |
} |
| 120 | 116 |
|
| 121 | 117 |
Devicemapper = testRequirement{
|
| 122 | 118 |
func() bool {
|
| 123 |
- cmd := exec.Command("grep", "^devicemapper / devicemapper", "/proc/mounts")
|
|
| 124 |
- if err := cmd.Run(); err != nil {
|
|
| 125 |
- return false |
|
| 126 |
- } |
|
| 127 |
- return true |
|
| 119 |
+ return strings.HasPrefix(daemonStorageDriver, "devicemapper") |
|
| 128 | 120 |
}, |
| 129 | 121 |
"Test requires underlying root filesystem to be backed by devicemapper.", |
| 130 | 122 |
} |