Merge pull request #2487 from moricho:fix/bindmount
PiperOrigin-RevId: 309082540
This commit is contained in:
commit
d5c34ba2ff
|
@ -219,6 +219,9 @@ func mountFlags(opts []string) fs.MountSourceFlags {
|
|||
mf.NoAtime = true
|
||||
case "noexec":
|
||||
mf.NoExec = true
|
||||
case "bind", "rbind":
|
||||
// When options include either "bind" or "rbind",
|
||||
// it's converted to a 9P mount.
|
||||
default:
|
||||
log.Warningf("ignoring unknown mount option %q", o)
|
||||
}
|
||||
|
@ -765,6 +768,16 @@ func (c *containerMounter) getMountNameAndOptions(conf *Config, m specs.Mount) (
|
|||
useOverlay bool
|
||||
)
|
||||
|
||||
for _, opt := range m.Options {
|
||||
// When options include either "bind" or "rbind", this behaves as
|
||||
// bind mount even if the mount type is equal to a filesystem supported
|
||||
// on runsc.
|
||||
if opt == "bind" || opt == "rbind" {
|
||||
m.Type = bind
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
switch m.Type {
|
||||
case devpts, devtmpfs, proc, sysfs:
|
||||
fsName = m.Type
|
||||
|
|
|
@ -1535,6 +1535,28 @@ func TestReadonlyMount(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestBindMountByOption(t *testing.T) {
|
||||
for _, conf := range configs(t, overlay) {
|
||||
t.Logf("Running test with conf: %+v", conf)
|
||||
|
||||
dir, err := ioutil.TempDir(testutil.TmpDir(), "bind-mount")
|
||||
spec := testutil.NewSpecWithArgs("/bin/touch", path.Join(dir, "file"))
|
||||
if err != nil {
|
||||
t.Fatalf("ioutil.TempDir() failed: %v", err)
|
||||
}
|
||||
spec.Mounts = append(spec.Mounts, specs.Mount{
|
||||
Destination: dir,
|
||||
Source: dir,
|
||||
Type: "none",
|
||||
Options: []string{"rw", "bind"},
|
||||
})
|
||||
|
||||
if err := run(spec, conf); err != nil {
|
||||
t.Fatalf("error running sandbox: %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TestAbbreviatedIDs checks that runsc supports using abbreviated container
|
||||
// IDs in place of full IDs.
|
||||
func TestAbbreviatedIDs(t *testing.T) {
|
||||
|
|
|
@ -1394,7 +1394,7 @@ func TestMultiContainerSharedMountUnsupportedOptions(t *testing.T) {
|
|||
Destination: "/mydir/test",
|
||||
Source: "/some/dir",
|
||||
Type: "tmpfs",
|
||||
Options: []string{"rw", "rbind", "relatime"},
|
||||
Options: []string{"rw", "relatime"},
|
||||
}
|
||||
podSpec[0].Mounts = append(podSpec[0].Mounts, mnt0)
|
||||
|
||||
|
|
|
@ -311,7 +311,19 @@ func capsFromNames(names []string, skipSet map[linux.Capability]struct{}) (auth.
|
|||
|
||||
// Is9PMount returns true if the given mount can be mounted as an external gofer.
|
||||
func Is9PMount(m specs.Mount) bool {
|
||||
return m.Type == "bind" && m.Source != "" && IsSupportedDevMount(m)
|
||||
var isBind bool
|
||||
switch m.Type {
|
||||
case "bind":
|
||||
isBind = true
|
||||
default:
|
||||
for _, opt := range m.Options {
|
||||
if opt == "bind" || opt == "rbind" {
|
||||
isBind = true
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
return isBind && m.Source != "" && IsSupportedDevMount(m)
|
||||
}
|
||||
|
||||
// IsSupportedDevMount returns true if the mount is a supported /dev mount.
|
||||
|
|
Loading…
Reference in New Issue