1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- // +build !windows
- package main
- import (
- "io/ioutil"
- "os"
- "path/filepath"
- "github.com/docker/docker/api/types"
- containertypes "github.com/docker/docker/api/types/container"
- mounttypes "github.com/docker/docker/api/types/mount"
- networktypes "github.com/docker/docker/api/types/network"
- "github.com/docker/docker/client"
- "github.com/docker/docker/integration-cli/checker"
- "github.com/docker/docker/pkg/ioutils"
- "github.com/docker/docker/pkg/system"
- "github.com/go-check/check"
- "github.com/stretchr/testify/assert"
- "golang.org/x/net/context"
- )
- func (s *DockerSuite) TestContainersAPINetworkMountsNoChown(c *check.C) {
- // chown only applies to Linux bind mounted volumes; must be same host to verify
- testRequires(c, DaemonIsLinux, SameHostDaemon)
- tmpDir, err := ioutils.TempDir("", "test-network-mounts")
- c.Assert(err, checker.IsNil)
- defer os.RemoveAll(tmpDir)
- // make tmp dir readable by anyone to allow userns process to mount from
- err = os.Chmod(tmpDir, 0755)
- c.Assert(err, checker.IsNil)
- // create temp files to use as network mounts
- tmpNWFileMount := filepath.Join(tmpDir, "nwfile")
- err = ioutil.WriteFile(tmpNWFileMount, []byte("network file bind mount"), 0644)
- c.Assert(err, checker.IsNil)
- config := containertypes.Config{
- Image: "busybox",
- }
- hostConfig := containertypes.HostConfig{
- Mounts: []mounttypes.Mount{
- {
- Type: "bind",
- Source: tmpNWFileMount,
- Target: "/etc/resolv.conf",
- },
- {
- Type: "bind",
- Source: tmpNWFileMount,
- Target: "/etc/hostname",
- },
- {
- Type: "bind",
- Source: tmpNWFileMount,
- Target: "/etc/hosts",
- },
- },
- }
- cli, err := client.NewEnvClient()
- c.Assert(err, checker.IsNil)
- defer cli.Close()
- ctrCreate, err := cli.ContainerCreate(context.Background(), &config, &hostConfig, &networktypes.NetworkingConfig{}, "")
- c.Assert(err, checker.IsNil)
- // container will exit immediately because of no tty, but we only need the start sequence to test the condition
- err = cli.ContainerStart(context.Background(), ctrCreate.ID, types.ContainerStartOptions{})
- c.Assert(err, checker.IsNil)
- // check that host-located bind mount network file did not change ownership when the container was started
- statT, err := system.Stat(tmpNWFileMount)
- c.Assert(err, checker.IsNil)
- assert.Equal(c, uint32(0), statT.UID(), "bind mounted network file should not change ownership from root")
- }
|