diff --git a/init/init.go b/init/init.go index cc549f8d..dc8f66cf 100644 --- a/init/init.go +++ b/init/init.go @@ -224,6 +224,9 @@ func RunInit() error { return c, dockerlaunch.PrepareFs(&mountConfig) }, initializeSelinux, + func(c *config.CloudConfig) (*config.CloudConfig, error) { + return c, syscall.Mount("", "/", "", syscall.MS_SHARED|syscall.MS_REC, "") + }, sysInit, } diff --git a/os-config.tpl.yml b/os-config.tpl.yml index 28132c2f..b5f63fd3 100644 --- a/os-config.tpl.yml +++ b/os-config.tpl.yml @@ -167,6 +167,8 @@ rancher: - all-volumes volumes: - /usr/bin/iptables:/sbin/iptables:ro + - /media:/media:shared + - /mnt:/mnt:shared container-data-volumes: image: {{.OS_IMAGES_ROOT}}/os-state:{{.VERSION}}{{.SUFFIX}} labels: diff --git a/tests/integration/rostest/test_15_shared_mount.py b/tests/integration/rostest/test_15_shared_mount.py new file mode 100644 index 00000000..9c0154f6 --- /dev/null +++ b/tests/integration/rostest/test_15_shared_mount.py @@ -0,0 +1,21 @@ +import pytest +import rostest.util as u +from rostest.util import SSH + + +@pytest.fixture(scope="module") +def qemu(request): + q = u.run_qemu(request) + u.flush_out(q.stdout) + return q + + +def test_shared_mount(qemu): + SSH(qemu).check_call(''' +set -x -e + +sudo mkdir /mnt/shared +sudo touch /test +sudo system-docker run --privileged -v /mnt:/mnt:shared -v /test:/test {busybox_image} mount --bind / /mnt/shared +ls /mnt/shared | grep test + '''.format(busybox_image=u.busybox_image)) diff --git a/tests/integration/rostest/util.py b/tests/integration/rostest/util.py index e9be1a52..86b2fc1f 100644 --- a/tests/integration/rostest/util.py +++ b/tests/integration/rostest/util.py @@ -15,6 +15,11 @@ if arch != 'amd64': suffix = '_' + arch +busybox_image = {'amd64': 'busybox', + 'arm': 'armhf/busybox', + 'arm64': 'aarch64/busybox'}[arch] + + def iter_lines(s): return it.imap(str.rstrip, iter(s.readline, ''))