diff --git a/gns3server/compute/docker/docker_vm.py b/gns3server/compute/docker/docker_vm.py index 81db36fe..350c6441 100644 --- a/gns3server/compute/docker/docker_vm.py +++ b/gns3server/compute/docker/docker_vm.py @@ -206,7 +206,7 @@ class DockerVM(BaseNode): # We mount our own etc/network network_config = self._create_network_config() - binds.append("{}:/etc/network:rw".format(network_config)) + binds.append("{}:/gns3volumes/etc/network:rw".format(network_config)) self._volumes = ["/etc/network"] @@ -216,7 +216,7 @@ class DockerVM(BaseNode): for volume in volumes.keys(): source = os.path.join(self.working_dir, os.path.relpath(volume, "/")) os.makedirs(source, exist_ok=True) - binds.append("{}:{}".format(source, volume)) + binds.append("{}:/gns3volumes{}".format(source, volume)) self._volumes.append(volume) return binds diff --git a/gns3server/compute/docker/resources/init.sh b/gns3server/compute/docker/resources/init.sh index d1b11d79..9ce22515 100755 --- a/gns3server/compute/docker/resources/init.sh +++ b/gns3server/compute/docker/resources/init.sh @@ -28,9 +28,18 @@ if [ ! -d /tmp/gns3/bin ]; then /gns3/bin/busybox --install -s /tmp/gns3/bin fi -# Restore file permission +# Restore file permission and mount volumes for i in $(echo "$GNS3_VOLUMES" | tr ":" "\n") do + # Copy original files if destination is empty (first start) + if ! [ "$(ls -A /gns3volumes$i)" ]; then + for file in $(ls -A "$i") + do + cp -a "$i/$file" "/gns3volumes$i/$file" + done + fi + + mount --bind "/gns3volumes$i" "$i" if [ -f "$i/.gns3_perms" ] then while IFS=: read PERMS OWNER GROUP FILE diff --git a/tests/compute/docker/test_docker_vm.py b/tests/compute/docker/test_docker_vm.py index dd9507d7..b5cd2e55 100644 --- a/tests/compute/docker/test_docker_vm.py +++ b/tests/compute/docker/test_docker_vm.py @@ -95,7 +95,7 @@ def test_create(loop, project, manager): "CapAdd": ["ALL"], "Binds": [ "{}:/gns3:ro".format(get_resource("compute/docker/resources")), - "{}:/etc/network:rw".format(os.path.join(vm.working_dir, "etc", "network")) + "{}:/gns3volumes/etc/network:rw".format(os.path.join(vm.working_dir, "etc", "network")) ], "Privileged": True }, @@ -107,7 +107,7 @@ def test_create(loop, project, manager): "Env": [ "GNS3_MAX_ETHERNET=eth0", "GNS3_VOLUMES=/etc/network" - ], + ], "Entrypoint": ["/gns3/init.sh"], "Cmd": ["/bin/sh"] }) @@ -133,7 +133,7 @@ def test_create_with_tag(loop, project, manager): "CapAdd": ["ALL"], "Binds": [ "{}:/gns3:ro".format(get_resource("compute/docker/resources")), - "{}:/etc/network:rw".format(os.path.join(vm.working_dir, "etc", "network")) + "{}:/gns3volumes/etc/network:rw".format(os.path.join(vm.working_dir, "etc", "network")) ], "Privileged": True }, @@ -145,7 +145,7 @@ def test_create_with_tag(loop, project, manager): "Env": [ "GNS3_MAX_ETHERNET=eth0", "GNS3_VOLUMES=/etc/network" - ], + ], "Entrypoint": ["/gns3/init.sh"], "Cmd": ["/bin/sh"] }) @@ -174,7 +174,7 @@ def test_create_vnc(loop, project, manager): "CapAdd": ["ALL"], "Binds": [ "{}:/gns3:ro".format(get_resource("compute/docker/resources")), - "{}:/etc/network:rw".format(os.path.join(vm.working_dir, "etc", "network")), + "{}:/gns3volumes/etc/network:rw".format(os.path.join(vm.working_dir, "etc", "network")), '/tmp/.X11-unix/:/tmp/.X11-unix/' ], "Privileged": True @@ -188,7 +188,7 @@ def test_create_vnc(loop, project, manager): "GNS3_MAX_ETHERNET=eth0", "GNS3_VOLUMES=/etc/network", "DISPLAY=:42" - ], + ], "Entrypoint": ["/gns3/init.sh"], "Cmd": ["/bin/sh"] }) @@ -217,7 +217,7 @@ def test_create_start_cmd(loop, project, manager): "CapAdd": ["ALL"], "Binds": [ "{}:/gns3:ro".format(get_resource("compute/docker/resources")), - "{}:/etc/network:rw".format(os.path.join(vm.working_dir, "etc", "network")) + "{}:/gns3volumes/etc/network:rw".format(os.path.join(vm.working_dir, "etc", "network")) ], "Privileged": True }, @@ -231,7 +231,7 @@ def test_create_start_cmd(loop, project, manager): "Env": [ "GNS3_MAX_ETHERNET=eth0", "GNS3_VOLUMES=/etc/network" - ] + ] }) assert vm._cid == "e90e34656806" @@ -256,7 +256,7 @@ def test_create_environment(loop, project, manager): "CapAdd": ["ALL"], "Binds": [ "{}:/gns3:ro".format(get_resource("compute/docker/resources")), - "{}:/etc/network:rw".format(os.path.join(vm.working_dir, "etc", "network")) + "{}:/gns3volumes/etc/network:rw".format(os.path.join(vm.working_dir, "etc", "network")) ], "Privileged": True }, @@ -265,7 +265,7 @@ def test_create_environment(loop, project, manager): "GNS3_VOLUMES=/etc/network", "YES=1", "NO=0" - ], + ], "Volumes": {}, "NetworkDisabled": True, "Name": "test", @@ -310,7 +310,7 @@ def test_create_image_not_available(loop, project, manager): "CapAdd": ["ALL"], "Binds": [ "{}:/gns3:ro".format(get_resource("compute/docker/resources")), - "{}:/etc/network:rw".format(os.path.join(vm.working_dir, "etc", "network")) + "{}:/gns3volumes/etc/network:rw".format(os.path.join(vm.working_dir, "etc", "network")) ], "Privileged": True }, @@ -322,7 +322,7 @@ def test_create_image_not_available(loop, project, manager): "Env": [ "GNS3_MAX_ETHERNET=eth0", "GNS3_VOLUMES=/etc/network" - ], + ], "Entrypoint": ["/gns3/init.sh"], "Cmd": ["/bin/sh"] }) @@ -530,7 +530,7 @@ def test_update(loop, vm): "CapAdd": ["ALL"], "Binds": [ "{}:/gns3:ro".format(get_resource("compute/docker/resources")), - "{}:/etc/network:rw".format(os.path.join(vm.working_dir, "etc", "network")) + "{}:/gns3volumes/etc/network:rw".format(os.path.join(vm.working_dir, "etc", "network")) ], "Privileged": True }, @@ -598,7 +598,7 @@ def test_update_running(loop, vm): "CapAdd": ["ALL"], "Binds": [ "{}:/gns3:ro".format(get_resource("compute/docker/resources")), - "{}:/etc/network:rw".format(os.path.join(vm.working_dir, "etc", "network")) + "{}:/gns3volumes/etc/network:rw".format(os.path.join(vm.working_dir, "etc", "network")) ], "Privileged": True }, @@ -875,8 +875,8 @@ def test_mount_binds(vm, tmpdir): dst = os.path.join(vm.working_dir, "test/experimental") assert vm._mount_binds(image_infos) == [ "{}:/gns3:ro".format(get_resource("compute/docker/resources")), - "{}:/etc/network:rw".format(os.path.join(vm.working_dir, "etc", "network")), - "{}:{}".format(dst, "/test/experimental") + "{}:/gns3volumes/etc/network:rw".format(os.path.join(vm.working_dir, "etc", "network")), + "{}:/gns3volumes{}".format(dst, "/test/experimental") ] assert vm._volumes == ["/etc/network", "/test/experimental"]