daemon/oci_linux_test: add TestIpcPrivateVsReadonly
The test case checks that in case of IpcMode: private and
ReadonlyRootfs: true (as in "docker run --ipc private --read-only")
the resulting /dev/shm mount is NOT made read-only.
@@ -48,3 +48,41 @@ func TestTmpfsDevShmNoDupMount(t *testing.T) {
err = setMounts(&d, &s, c, ms)
assert.NoError(t, err)
}
+
+// TestIpcPrivateVsReadonly checks that in case of IpcMode: private
+// and ReadonlyRootfs: true (as in "docker run --ipc private --read-only")
+// the resulting /dev/shm mount is NOT made read-only.
+// https://github.com/moby/moby/issues/36503
+func TestIpcPrivateVsReadonly(t *testing.T) {
+ d := Daemon{
+ // some empty structs to avoid getting a panic
+ // caused by a null pointer dereference
+ idMappings: &idtools.IDMappings{},
+ configStore: &config.Config{},
+ }
+ c := &container.Container{
+ HostConfig: &containertypes.HostConfig{
+ IpcMode: containertypes.IpcMode("private"),
+ ReadonlyRootfs: true,
+ },
+ }
+
+ // We can't call createSpec() so mimick the minimal part
+ // of its code flow, just enough to reproduce the issue.
+ ms, err := d.setupMounts(c)
+ assert.NoError(t, err)
+
+ s := oci.DefaultSpec()
+ s.Root.Readonly = c.HostConfig.ReadonlyRootfs
+
+ err = setMounts(&d, &s, c, ms)
+ assert.NoError(t, err)
+
+ // Find the /dev/shm mount in ms, check it does not have ro
+ for _, m := range s.Mounts {
+ if m.Destination != "/dev/shm" {
+ continue
+ }
+ assert.Equal(t, false, inSlice(m.Options, "ro"))
+ }
+}
