소스 검색

Merge pull request #24504 from hqhq/soften_update_kmem

Soften limitation of update kernel memory
Sebastiaan van Stijn 9 년 전
부모
커밋
110b2aecda
4개의 변경된 파일52개의 추가작업 그리고 17개의 파일을 삭제
  1. 0 4
      daemon/update.go
  2. 17 3
      docs/reference/commandline/update.md
  3. 15 5
      integration-cli/docker_cli_update_unix_test.go
  4. 20 5
      man/docker-update.1.md

+ 0 - 4
daemon/update.go

@@ -61,10 +61,6 @@ func (daemon *Daemon) update(name string, hostConfig *container.HostConfig) erro
 		return errCannotUpdate(container.ID, fmt.Errorf("Container is marked for removal and cannot be \"update\"."))
 		return errCannotUpdate(container.ID, fmt.Errorf("Container is marked for removal and cannot be \"update\"."))
 	}
 	}
 
 
-	if container.IsRunning() && hostConfig.KernelMemory != 0 {
-		return errCannotUpdate(container.ID, fmt.Errorf("Can not update kernel memory to a running container, please stop it first."))
-	}
-
 	if err := container.UpdateContainer(hostConfig); err != nil {
 	if err := container.UpdateContainer(hostConfig); err != nil {
 		restoreConfig = true
 		restoreConfig = true
 		return errCannotUpdate(container.ID, err)
 		return errCannotUpdate(container.ID, err)

+ 17 - 3
docs/reference/commandline/update.md

@@ -38,9 +38,23 @@ space-separated list of container names or IDs.
 
 
 With the exception of the `--kernel-memory` value, you can specify these
 With the exception of the `--kernel-memory` value, you can specify these
 options on a running or a stopped container. You can only update
 options on a running or a stopped container. You can only update
-`--kernel-memory` on a stopped container. When you run `docker update` on
-stopped container, the next time you restart it, the container uses those
-values.
+`--kernel-memory` on a stopped container or on a running container with
+kernel memory initialized. For example, if you started a container with
+command:
+
+    # docker run -ti --name test --kernel-memory 50M ubuntu bash
+
+You can update kernel memory of this running container:
+
+    # docker update --kernel-memory 80M test
+
+If you started a container without kernel memory initialized:
+
+    # docker run -ti --name test2 --memory 300M ubuntu bash
+
+Update kernel memory of running container `test2` will fail, you can only
+stop the container and update kernel memory then. The next time you
+restart it, the container uses the new value.
 
 
 Another configuration you can change with this command is restart policy,
 Another configuration you can change with this command is restart policy,
 new restart policy will take effect instantly after you run `docker update`
 new restart policy will take effect instantly after you run `docker update`

+ 15 - 5
integration-cli/docker_cli_update_unix_test.go

@@ -120,17 +120,27 @@ func (s *DockerSuite) TestUpdateKernelMemory(c *check.C) {
 
 
 	name := "test-update-container"
 	name := "test-update-container"
 	dockerCmd(c, "run", "-d", "--name", name, "--kernel-memory", "50M", "busybox", "top")
 	dockerCmd(c, "run", "-d", "--name", name, "--kernel-memory", "50M", "busybox", "top")
+	dockerCmd(c, "update", "--kernel-memory", "100M", name)
+
+	c.Assert(inspectField(c, name, "HostConfig.KernelMemory"), checker.Equals, "104857600")
+
+	file := "/sys/fs/cgroup/memory/memory.kmem.limit_in_bytes"
+	out, _ := dockerCmd(c, "exec", name, "cat", file)
+	c.Assert(strings.TrimSpace(out), checker.Equals, "104857600")
+}
+
+func (s *DockerSuite) TestUpdateKernelMemoryUninitialized(c *check.C) {
+	testRequires(c, DaemonIsLinux, kernelMemorySupport)
+
+	name := "test-update-container"
+	dockerCmd(c, "run", "-d", "--name", name, "busybox", "top")
 	_, _, err := dockerCmdWithError("update", "--kernel-memory", "100M", name)
 	_, _, err := dockerCmdWithError("update", "--kernel-memory", "100M", name)
-	// Update kernel memory to a running container is not allowed.
+	// Update kernel memory to a running container without kernel memory initialized is not allowed.
 	c.Assert(err, check.NotNil)
 	c.Assert(err, check.NotNil)
 
 
-	// Update kernel memory to a running container with failure should not change HostConfig
-	c.Assert(inspectField(c, name, "HostConfig.KernelMemory"), checker.Equals, "52428800")
-
 	dockerCmd(c, "pause", name)
 	dockerCmd(c, "pause", name)
 	_, _, err = dockerCmdWithError("update", "--kernel-memory", "100M", name)
 	_, _, err = dockerCmdWithError("update", "--kernel-memory", "100M", name)
 	c.Assert(err, check.NotNil)
 	c.Assert(err, check.NotNil)
-	c.Assert(inspectField(c, name, "HostConfig.KernelMemory"), checker.Equals, "52428800")
 	dockerCmd(c, "unpause", name)
 	dockerCmd(c, "unpause", name)
 
 
 	dockerCmd(c, "stop", name)
 	dockerCmd(c, "stop", name)

+ 20 - 5
man/docker-update.1.md

@@ -30,9 +30,23 @@ provide space-separated list of container names or IDs.
 
 
 With the exception of the `--kernel-memory` value, you can specify these
 With the exception of the `--kernel-memory` value, you can specify these
 options on a running or a stopped container. You can only update
 options on a running or a stopped container. You can only update
-`--kernel-memory` on a stopped container. When you run `docker update` on
-stopped container, the next time you restart it, the container uses those
-values.
+`--kernel-memory` on a stopped container or on a running container with
+kernel memory initialized. For example, if you started a container with
+command:
+
+    # docker run -ti --name test --kernel-memory 50M ubuntu bash
+
+You can update kernel memory of this running container:
+
+    # docker update --kernel-memory 80M test
+
+If you started a container without kernel memory initialized:
+
+    # docker run -ti --name test2 --memory 300M ubuntu bash
+
+Update kernel memory of running container `test2` will fail, you can only
+stop the container and update kernel memory then. The next time you
+restart it, the container uses the new value.
 
 
 Another configuration you can change with this command is restart policy,
 Another configuration you can change with this command is restart policy,
 new restart policy will take effect instantly after you run `docker update`
 new restart policy will take effect instantly after you run `docker update`
@@ -63,8 +77,9 @@ on a container.
 **--kernel-memory**=""
 **--kernel-memory**=""
    Kernel memory limit (format: `<number>[<unit>]`, where unit = b, k, m or g)
    Kernel memory limit (format: `<number>[<unit>]`, where unit = b, k, m or g)
 
 
-   Note that you can not update kernel memory to a running container, it can only
-be updated to a stopped container, and affect after it's started.
+   Note that you can not update kernel memory to a running container if the container
+is started without kernel memory initialized, in this case, it can only be updated
+after it's stopped, and affect after it's started.
 
 
 **-m**, **--memory**=""
 **-m**, **--memory**=""
    Memory limit (format: <number><optional unit>, where unit = b, k, m or g)
    Memory limit (format: <number><optional unit>, where unit = b, k, m or g)