diff --git a/libpod/container_internal_common.go b/libpod/container_internal_common.go index 07627abd1e..3ce372313e 100644 --- a/libpod/container_internal_common.go +++ b/libpod/container_internal_common.go @@ -2882,8 +2882,13 @@ func (c *Container) fixVolumePermissions(v *ContainerNamedVolume) error { return err } - // Make sure the new volume matches the permissions of the target directory. + // Make sure the new volume matches the permissions of the target directory unless 'U' is + // provided (since the volume was already chowned in this case). // https://github.com/containers/podman/issues/10188 + if slices.Contains(v.Options, "U") { + return nil + } + st, err := os.Lstat(filepath.Join(c.state.Mountpoint, v.Dest)) if err == nil { if stat, ok := st.Sys().(*syscall.Stat_t); ok { diff --git a/test/e2e/run_volume_test.go b/test/e2e/run_volume_test.go index 4e777d62ef..8d17f4af63 100644 --- a/test/e2e/run_volume_test.go +++ b/test/e2e/run_volume_test.go @@ -740,15 +740,6 @@ VOLUME /test/`, ALPINE) Skip("cannot find mappings for the current user") } - if os.Getenv("container") != "" { - Skip("Overlay mounts not supported when running in a container") - } - if isRootless() { - if _, err := exec.LookPath("fuse_overlay"); err != nil { - Skip("Fuse-Overlayfs required for rootless overlay mount test") - } - } - mountPath := filepath.Join(podmanTest.TempDir, "secrets") err = os.Mkdir(mountPath, 0755) Expect(err).ToNot(HaveOccurred()) @@ -759,6 +750,12 @@ VOLUME /test/`, ALPINE) Expect(session).Should(ExitCleanly()) Expect(session.OutputToString()).To(ContainSubstring("888:888")) + // test with an existing directory in the image + session = podmanTest.Podman([]string{"run", "--rm", "--user", "881:882", "-v", "NAMED-VOLUME:/mnt:U", ALPINE, "stat", "-c", "%u:%g", "/mnt"}) + session.WaitWithDefaultTimeout() + Expect(session).Should(ExitCleanly()) + Expect(session.OutputToString()).To(ContainSubstring("881:882")) + session = podmanTest.Podman([]string{"run", "--rm", "--user", "888:888", "--userns", "auto", "-v", vol, ALPINE, "stat", "-c", "%u:%g", dest}) session.WaitWithDefaultTimeout() Expect(session).Should(ExitCleanly())