diff --git a/init/init.go b/init/init.go index 98293023..5efb9b5b 100644 --- a/init/init.go +++ b/init/init.go @@ -218,6 +218,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 ccd6b4f7..3b7e82dc 100644 --- a/os-config.tpl.yml +++ b/os-config.tpl.yml @@ -171,6 +171,8 @@ rancher: - all-volumes volumes: - /usr/bin/iptables:/sbin/iptables:ro + - /media:/media:shared + - /mnt:/mnt:shared container-data-volumes: image: {{.OS_REPO}}/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 3d73ed56..3f8559cf 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, ''))