| // build +linux |
| package main |
| |
| import ( |
| "bufio" |
| "context" |
| "io/ioutil" |
| "os" |
| "strings" |
| |
| "github.com/docker/docker/api/types" |
| "github.com/docker/docker/api/types/container" |
| "github.com/docker/docker/integration-cli/checker" |
| "github.com/docker/docker/integration-cli/cli" |
| "github.com/go-check/check" |
| ) |
| |
| /* testIpcCheckDevExists checks whether a given mount (identified by its |
| * major:minor pair from /proc/self/mountinfo) exists on the host system. |
| * |
| * The format of /proc/self/mountinfo is like: |
| * |
| * 29 23 0:24 / /dev/shm rw,nosuid,nodev shared:4 - tmpfs tmpfs rw |
| * ^^^^\ |
| * - this is the minor:major we look for |
| */ |
| func testIpcCheckDevExists(mm string) (bool, error) { |
| f, err := os.Open("/proc/self/mountinfo") |
| if err != nil { |
| return false, err |
| } |
| defer f.Close() |
| |
| s := bufio.NewScanner(f) |
| for s.Scan() { |
| fields := strings.Fields(s.Text()) |
| if len(fields) < 7 { |
| continue |
| } |
| if fields[2] == mm { |
| return true, nil |
| } |
| } |
| |
| return false, s.Err() |
| } |
| |
| /* TestAPIIpcModeHost checks that a container created with --ipc host |
| * can use IPC of the host system. |
| */ |
| func (s *DockerSuite) TestAPIIpcModeHost(c *check.C) { |
| testRequires(c, DaemonIsLinux, SameHostDaemon, NotUserNamespace) |
| |
| cfg := container.Config{ |
| Image: "busybox", |
| Cmd: []string{"top"}, |
| } |
| hostCfg := container.HostConfig{ |
| IpcMode: container.IpcMode("host"), |
| } |
| ctx := context.Background() |
| |
| client := testEnv.APIClient() |
| resp, err := client.ContainerCreate(ctx, &cfg, &hostCfg, nil, "") |
| c.Assert(err, checker.IsNil) |
| c.Assert(len(resp.Warnings), checker.Equals, 0) |
| name := resp.ID |
| |
| err = client.ContainerStart(ctx, name, types.ContainerStartOptions{}) |
| c.Assert(err, checker.IsNil) |
| |
| // check that IPC is shared |
| // 1. create a file inside container |
| cli.DockerCmd(c, "exec", name, "sh", "-c", "printf covfefe > /dev/shm/."+name) |
| // 2. check it's the same on the host |
| bytes, err := ioutil.ReadFile("/dev/shm/." + name) |
| c.Assert(err, checker.IsNil) |
| c.Assert(string(bytes), checker.Matches, "^covfefe$") |
| // 3. clean up |
| cli.DockerCmd(c, "exec", name, "rm", "-f", "/dev/shm/."+name) |
| } |