Merge pull request #24504 from hqhq/soften_update_kmem

Soften limitation of update kernel memory
This commit is contained in:
Sebastiaan van Stijn 2016-07-12 13:58:17 +02:00 committed by GitHub
commit 110b2aecda
4 changed files with 53 additions and 18 deletions

View File

@ -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\"."))
}
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 {
restoreConfig = true
return errCannotUpdate(container.ID, err)

View File

@ -38,9 +38,23 @@ space-separated list of container names or IDs.
With the exception of the `--kernel-memory` value, you can specify these
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,
new restart policy will take effect instantly after you run `docker update`

View File

@ -120,17 +120,27 @@ func (s *DockerSuite) TestUpdateKernelMemory(c *check.C) {
name := "test-update-container"
dockerCmd(c, "run", "-d", "--name", name, "--kernel-memory", "50M", "busybox", "top")
_, _, err := dockerCmdWithError("update", "--kernel-memory", "100M", name)
// Update kernel memory to a running container is not allowed.
c.Assert(err, check.NotNil)
dockerCmd(c, "update", "--kernel-memory", "100M", name)
// Update kernel memory to a running container with failure should not change HostConfig
c.Assert(inspectField(c, name, "HostConfig.KernelMemory"), checker.Equals, "52428800")
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)
// Update kernel memory to a running container without kernel memory initialized is not allowed.
c.Assert(err, check.NotNil)
dockerCmd(c, "pause", name)
_, _, err = dockerCmdWithError("update", "--kernel-memory", "100M", name)
c.Assert(err, check.NotNil)
c.Assert(inspectField(c, name, "HostConfig.KernelMemory"), checker.Equals, "52428800")
dockerCmd(c, "unpause", name)
dockerCmd(c, "stop", name)

View File

@ -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
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,
new restart policy will take effect instantly after you run `docker update`
@ -63,8 +77,9 @@ on a container.
**--kernel-memory**=""
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**=""
Memory limit (format: <number><optional unit>, where unit = b, k, m or g)