|
@@ -4,7 +4,6 @@ package main
|
|
|
import (
|
|
|
"bufio"
|
|
|
"context"
|
|
|
- "fmt"
|
|
|
"io/ioutil"
|
|
|
"os"
|
|
|
"strings"
|
|
@@ -46,71 +45,6 @@ func testIpcCheckDevExists(mm string) (bool, error) {
|
|
|
return false, s.Err()
|
|
|
}
|
|
|
|
|
|
-// testIpcContainer is a helper function to test --ipc container:NNN mode in various scenarios
|
|
|
-func testIpcContainer(s *DockerSuite, c *check.C, donorMode string, mustWork bool) {
|
|
|
- cfg := container.Config{
|
|
|
- Image: "busybox",
|
|
|
- Cmd: []string{"top"},
|
|
|
- }
|
|
|
- hostCfg := container.HostConfig{
|
|
|
- IpcMode: container.IpcMode(donorMode),
|
|
|
- }
|
|
|
- ctx := context.Background()
|
|
|
-
|
|
|
- client := testEnv.APIClient()
|
|
|
-
|
|
|
- // create and start the "donor" container
|
|
|
- resp, err := client.ContainerCreate(ctx, &cfg, &hostCfg, nil, "")
|
|
|
- c.Assert(err, checker.IsNil)
|
|
|
- c.Assert(len(resp.Warnings), checker.Equals, 0)
|
|
|
- name1 := resp.ID
|
|
|
-
|
|
|
- err = client.ContainerStart(ctx, name1, types.ContainerStartOptions{})
|
|
|
- c.Assert(err, checker.IsNil)
|
|
|
-
|
|
|
- // create and start the second container
|
|
|
- hostCfg.IpcMode = container.IpcMode("container:" + name1)
|
|
|
- resp, err = client.ContainerCreate(ctx, &cfg, &hostCfg, nil, "")
|
|
|
- c.Assert(err, checker.IsNil)
|
|
|
- c.Assert(len(resp.Warnings), checker.Equals, 0)
|
|
|
- name2 := resp.ID
|
|
|
-
|
|
|
- err = client.ContainerStart(ctx, name2, types.ContainerStartOptions{})
|
|
|
- if !mustWork {
|
|
|
- // start should fail with a specific error
|
|
|
- c.Assert(err, checker.NotNil)
|
|
|
- c.Assert(fmt.Sprintf("%v", err), checker.Contains, "non-shareable IPC")
|
|
|
- // no more checks to perform here
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- // start should succeed
|
|
|
- c.Assert(err, checker.IsNil)
|
|
|
-
|
|
|
- // check that IPC is shared
|
|
|
- // 1. create a file in the first container
|
|
|
- cli.DockerCmd(c, "exec", name1, "sh", "-c", "printf covfefe > /dev/shm/bar")
|
|
|
- // 2. check it's the same file in the second one
|
|
|
- out := cli.DockerCmd(c, "exec", "-i", name2, "cat", "/dev/shm/bar").Combined()
|
|
|
- c.Assert(out, checker.Matches, "^covfefe$")
|
|
|
-}
|
|
|
-
|
|
|
-/* TestAPIIpcModeShareableAndContainer checks that a container created with
|
|
|
- * --ipc container:ID can use IPC of another shareable container.
|
|
|
- */
|
|
|
-func (s *DockerSuite) TestAPIIpcModeShareableAndContainer(c *check.C) {
|
|
|
- testRequires(c, DaemonIsLinux)
|
|
|
- testIpcContainer(s, c, "shareable", true)
|
|
|
-}
|
|
|
-
|
|
|
-/* TestAPIIpcModePrivateAndContainer checks that a container created with
|
|
|
- * --ipc container:ID can NOT use IPC of another private container.
|
|
|
- */
|
|
|
-func (s *DockerSuite) TestAPIIpcModePrivateAndContainer(c *check.C) {
|
|
|
- testRequires(c, DaemonIsLinux, MinimumAPIVersion("1.32"))
|
|
|
- testIpcContainer(s, c, "private", false)
|
|
|
-}
|
|
|
-
|
|
|
/* TestAPIIpcModeHost checks that a container created with --ipc host
|
|
|
* can use IPC of the host system.
|
|
|
*/
|