diff --git a/pkg/containerd/opts/spec_windows.go b/pkg/containerd/opts/spec_windows.go index 4f599b04b..9793faa94 100644 --- a/pkg/containerd/opts/spec_windows.go +++ b/pkg/containerd/opts/spec_windows.go @@ -77,8 +77,7 @@ func WithWindowsMounts(osi osinterface.OS, config *runtime.ContainerConfig, extr sort.Sort(orderedMounts(mounts)) // Copy all mounts from default mounts, except for - // - mounts overridden by supplied mount; - // - all mounts under /dev if a supplied /dev is present. + // mounts overridden by supplied mount; mountSet := make(map[string]struct{}) for _, m := range mounts { mountSet[filepath.Clean(m.ContainerPath)] = struct{}{} @@ -123,8 +122,9 @@ func WithWindowsMounts(osi osinterface.OS, config *runtime.ContainerConfig, extr options = append(options, "rw") } s.Mounts = append(s.Mounts, runtimespec.Mount{ - Source: src, - Destination: dst, + // hcsshim requires clean path, especially '/' -> '\'. + Source: filepath.Clean(src), + Destination: filepath.Clean(dst), Options: options, }) } diff --git a/pkg/server/container_create_windows_test.go b/pkg/server/container_create_windows_test.go index 778f489dd..38b14fcf1 100644 --- a/pkg/server/container_create_windows_test.go +++ b/pkg/server/container_create_windows_test.go @@ -140,3 +140,22 @@ func TestContainerWindowsNetworkNamespace(t *testing.T) { assert.NotNil(t, spec.Windows.Network) assert.Equal(t, nsPath, spec.Windows.Network.NetworkNamespace) } + +func TestMountCleanPath(t *testing.T) { + testID := "test-id" + testSandboxID := "sandbox-id" + testPid := uint32(1234) + nsPath := "test-cni" + c := newTestCRIService() + + containerConfig, sandboxConfig, imageConfig, specCheck := getCreateContainerTestData() + containerConfig.Mounts = append(containerConfig.Mounts, &runtime.Mount{ + ContainerPath: "c:/test/container-path", + HostPath: "c:/test/host-path", + }) + spec, err := c.containerSpec(testID, testSandboxID, testPid, nsPath, containerConfig, sandboxConfig, imageConfig, nil, config.Runtime{}) + assert.NoError(t, err) + assert.NotNil(t, spec) + specCheck(t, testID, testSandboxID, testPid, spec) + checkMount(t, spec.Mounts, "c:\\test\\host-path", "c:\\test\\container-path", "", []string{"rw"}, nil) +}