Repository: containers/podman
Pull request #25664: Add volume SubPath in generate kube
Author: login: victortoso
Labels: name: lgtm
description: Indicates that a PR is ready to be merged.
name: approved
description: Indicates a PR has been approved by an approver from all required OWNERS files.
name: release-note
name: locked - please file new issue/PR
description: Assist humans wanting to comment on an old issue or PR with locked comments.
Created: 2025-03-24T17:09:48Z | Merged: 2025-03-25T14:33:11Z

Hi,

While learning about using Podman to run services, I've realized that trying to generate the Pod.yaml for `--mount`  of volume type using SubPath would not pass that information to the generated Pod. Just a one liner, decided to write the test just to be sure we don't have regressions in the future.

```
$ podman run --rm -it \
    --mount type=volume,source=test,volume-subpath=/etc/etcfile,target=/etc/file1 \
    --mount type=volume,source=test,volume-subpath=/var/varfile,target=/var/file2 \
    docker.io/library/httpd

$ podman generate kube $ctrl
```

The diff will add the SubPath now
```diff
      volumeMounts:
      - mountPath: /etc/file1
        name: test-pvc
+       subPath: /etc/etcfile
      - mountPath: /var/file2
        name: test-pvc
+       subPath: /var/varfile
    volumes:
    - name: test-pvc
```

Note that `kube play` can handle SubPath since https://github.com/containers/podman/pull/16803

Cheers,

<!--
Thanks for sending a pull request!

Please make sure you've read our contributing guidelines and how to submit a pull request (https://github.com/containers/podman/blob/main/CONTRIBUTING.md#submitting-pull-requests).

Finally, be sure to sign commits with your real name. Since by opening
a PR you already have commits, you can add signatures if needed with
something like `git commit -s --amend`.
-->

#### Does this PR introduce a user-facing change?

<!--
If no, just write `None` in the release-note block below. If yes, a release note
is required: Enter your extended release note in the block below. If the PR
requires additional action from users switching to the new release, include the
string "action required".

For more information on release notes, please follow the Kubernetes model:
https://git.k8s.io/community/contributors/guide/release-notes.md
-->

```release-note
Fix kube generation of SubPath in VolumeMount
```



Diff:
diff --git a/libpod/kube.go b/libpod/kube.go
index 0257bbf26db..b3e087ce323 100644
--- a/libpod/kube.go
+++ b/libpod/kube.go
@@ -1195,6 +1195,7 @@ func generateKubePersistentVolumeClaim(v *ContainerNamedVolume) (v1.VolumeMount,
 	vm.Name = name
 	vm.MountPath = v.Dest
 	vm.ReadOnly = ro
+	vm.SubPath = v.SubPath
 
 	pvc := v1.PersistentVolumeClaimVolumeSource{ClaimName: vName, ReadOnly: ro}
 	vs := v1.VolumeSource{}
diff --git a/test/e2e/generate_kube_test.go b/test/e2e/generate_kube_test.go
index 09d60aa9227..67f2d82ae1a 100644
--- a/test/e2e/generate_kube_test.go
+++ b/test/e2e/generate_kube_test.go
@@ -849,6 +849,57 @@ var _ = Describe("Podman kube generate", func() {
 		Expect(inspect.OutputToString()).To(ContainSubstring(vol1))
 	})
 
+	It("with subpath volume", func() {
+		// We want to verify that generating Volume's subPath is working properly
+		// https://kubernetes.io/docs/concepts/storage/volumes/#using-subpath
+		// by creating a volume with two directories and mounthing them separately
+		volName := "vol-test1"
+		pvcName := fmt.Sprintf("%s-pvc", volName)
+		podmanTest.PodmanExitCleanly("volume", "create", volName)
+
+		mountPoint := "/mnt"
+
+		etcFile := "etcfile"
+		etcDirPath := filepath.Join(mountPoint, "etc")
+		etcSubPath := filepath.Join("/etc", etcFile)
+		etcMountSubPath := filepath.Join(mountPoint, etcSubPath)
+		populateEtcCmd := fmt.Sprintf("mkdir -p %s; touch %s", etcDirPath, etcMountSubPath)
+
+		varFile := "varfile"
+		varDirPath := filepath.Join(mountPoint, "var")
+		varSubPath := filepath.Join("/var", varFile)
+		varMountSubPath := filepath.Join(mountPoint, varSubPath)
+		populateVarCmd := fmt.Sprintf("mkdir -p %s; touch %s", varDirPath, varMountSubPath)
+
+		cmd := fmt.Sprintf("%s; %s", populateEtcCmd, populateVarCmd)
+		vol := fmt.Sprintf("%s:%s", volName, mountPoint)
+		podmanTest.PodmanExitCleanly("run", "-v", vol, ALPINE, "sh", "-c", cmd)
+
+		etcTargetPath := filepath.Join(mountPoint, etcFile)
+		varTargetPath := filepath.Join(mountPoint, varFile)
+		mountTemplate := "type=volume,source=%s,volume-subpath=%s,target=%s"
+		podmanTest.PodmanExitCleanly("run", "-d", "--pod", "new:test1", "--name", "test-ctr",
+			"--mount", fmt.Sprintf(mountTemplate, volName, etcSubPath, etcTargetPath),
+			"--mount", fmt.Sprintf(mountTemplate, volName, varSubPath, varTargetPath),
+			CITEST_IMAGE, "top")
+
+		kube := podmanTest.PodmanExitCleanly("kube", "generate", "test1")
+
+		pod := new(v1.Pod)
+		err = yaml.Unmarshal(kube.Out.Contents(), pod)
+		Expect(err).ToNot(HaveOccurred())
+		Expect(pod.Spec.Containers[0].VolumeMounts).To(ContainElements(v1.VolumeMount{
+			Name:      pvcName,
+			MountPath: etcTargetPath,
+			SubPath:   etcSubPath,
+		}, v1.VolumeMount{
+			Name:      pvcName,
+			MountPath: varTargetPath,
+			SubPath:   varSubPath,
+		}),
+		)
+	})
+
 	It("when bind-mounting '/' and '/root' at the same time ", func() {
 		// Fixes https://github.com/containers/podman/issues/9764
 


Reviews:
user: login: baude
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-24T18:06:06Z
user: login: baude
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-24T18:10:20Z
user: login: Luap99
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-24T18:42:08Z
user: login: victortoso
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-25T10:18:20Z
user: login: victortoso
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-25T10:20:08Z
user: login: victortoso
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-25T10:25:53Z
user: login: Luap99
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-25T10:49:13Z
user: login: victortoso
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-25T10:59:52Z
user: login: Luap99
body: LGTM
state: APPROVED
author_association: MEMBER
submitted_at: 2025-03-25T11:02:50Z

Review comments:
diff_hunk: @@ -849,6 +849,62 @@ var _ = Describe("Podman kube generate", func() {
 		Expect(inspect.OutputToString()).To(ContainSubstring(vol1))
 	})
 
+	It("with subpath volume", func() {
+		var args []string
+		volName := "vol-test1"
+		mkvol := podmanTest.Podman([]string{"volume", "create", volName})
+		mkvol.WaitWithDefaultTimeout()
+		Expect(mkvol).Should(ExitCleanly())
+
+		mountPoint := "/mnt"
+		filepath1 := "etc/etcfile"
+		dir1 := filepath.Join(mountPoint, "etc")
+		inFile1 := filepath.Join(mountPoint, filepath1)
+		exec1 := fmt.Sprintf("mkdir -p %s; touch %s", dir1, inFile1)
+
+		filepath2 := "var/varfile"
+		dir2 := filepath.Join(mountPoint, "var")
+		inFile2 := filepath.Join(dir2, "varfile")
+		exec2 := fmt.Sprintf("mkdir -p %s; touch %s", dir2, inFile2)
+
+		popvol := podmanTest.Podman([]string{"run", "-v", volName + ":" + mountPoint,
path: test/e2e/generate_kube_test.go
user: login: baude
body: you can now use `podmanTest.PodmanExitCleanly()` for calls like this. See https://github.com/containers/podman/blob/main/test/e2e/pull_chunked_test.go#L77
created_at: 2025-03-24T18:06:05Z
author_association: MEMBER
diff_hunk: @@ -849,6 +849,62 @@ var _ = Describe("Podman kube generate", func() {
 		Expect(inspect.OutputToString()).To(ContainSubstring(vol1))
 	})
 
+	It("with subpath volume", func() {
+		var args []string
+		volName := "vol-test1"
+		mkvol := podmanTest.Podman([]string{"volume", "create", volName})
+		mkvol.WaitWithDefaultTimeout()
+		Expect(mkvol).Should(ExitCleanly())
+
+		mountPoint := "/mnt"
+		filepath1 := "etc/etcfile"
+		dir1 := filepath.Join(mountPoint, "etc")
+		inFile1 := filepath.Join(mountPoint, filepath1)
+		exec1 := fmt.Sprintf("mkdir -p %s; touch %s", dir1, inFile1)
+
+		filepath2 := "var/varfile"
+		dir2 := filepath.Join(mountPoint, "var")
+		inFile2 := filepath.Join(dir2, "varfile")
+		exec2 := fmt.Sprintf("mkdir -p %s; touch %s", dir2, inFile2)
+
+		popvol := podmanTest.Podman([]string{"run", "-v", volName + ":" + mountPoint,
+			ALPINE, "sh", "-c", exec1 + ";" + exec2,
+		})
+		popvol.WaitWithDefaultTimeout()
+		Expect(popvol).Should(ExitCleanly())
+
+		mountTemplate := "type=volume,source=%s,volume-subpath=/%s,target=/%s"
+		args = []string{"run", "-d", "--pod", "new:test1", "--name", "test-ctr",
+			"--mount", fmt.Sprintf(mountTemplate, volName, filepath1, filepath1),
+			"--mount", fmt.Sprintf(mountTemplate, volName, filepath2, filepath2),
+			CITEST_IMAGE, "top"}
+
+		session1 := podmanTest.Podman(args)
+		session1.WaitWithDefaultTimeout()
+		Expect(session1).Should(ExitCleanly())
+
+		outputFile := filepath.Join(podmanTest.RunRoot, "pod.yaml")
+		kube := podmanTest.Podman([]string{"kube", "generate", "test1", "-f", outputFile})
+		kube.WaitWithDefaultTimeout()
+		Expect(kube).Should(ExitCleanly())
+
+		b, err := os.ReadFile(outputFile)
path: test/e2e/generate_kube_test.go
user: login: baude
body: this could be avoided if you removed the `-f` above and then examine the output?
created_at: 2025-03-24T18:10:20Z
author_association: MEMBER
diff_hunk: @@ -849,6 +849,62 @@ var _ = Describe("Podman kube generate", func() {
 		Expect(inspect.OutputToString()).To(ContainSubstring(vol1))
 	})
 
+	It("with subpath volume", func() {
+		var args []string
+		volName := "vol-test1"
+		mkvol := podmanTest.Podman([]string{"volume", "create", volName})
+		mkvol.WaitWithDefaultTimeout()
+		Expect(mkvol).Should(ExitCleanly())
+
+		mountPoint := "/mnt"
+		filepath1 := "etc/etcfile"
+		dir1 := filepath.Join(mountPoint, "etc")
+		inFile1 := filepath.Join(mountPoint, filepath1)
+		exec1 := fmt.Sprintf("mkdir -p %s; touch %s", dir1, inFile1)
+
+		filepath2 := "var/varfile"
+		dir2 := filepath.Join(mountPoint, "var")
+		inFile2 := filepath.Join(dir2, "varfile")
+		exec2 := fmt.Sprintf("mkdir -p %s; touch %s", dir2, inFile2)
+
+		popvol := podmanTest.Podman([]string{"run", "-v", volName + ":" + mountPoint,
+			ALPINE, "sh", "-c", exec1 + ";" + exec2,
+		})
+		popvol.WaitWithDefaultTimeout()
+		Expect(popvol).Should(ExitCleanly())
+
+		mountTemplate := "type=volume,source=%s,volume-subpath=/%s,target=/%s"
+		args = []string{"run", "-d", "--pod", "new:test1", "--name", "test-ctr",
+			"--mount", fmt.Sprintf(mountTemplate, volName, filepath1, filepath1),
+			"--mount", fmt.Sprintf(mountTemplate, volName, filepath2, filepath2),
path: test/e2e/generate_kube_test.go
user: login: Luap99
body: for better test coverage subpath and target should be different paths. With this the test does not notice if someone assigned the mount target path to the subpath in generate.
created_at: 2025-03-24T18:42:07Z
author_association: MEMBER
diff_hunk: @@ -849,6 +849,62 @@ var _ = Describe("Podman kube generate", func() {
 		Expect(inspect.OutputToString()).To(ContainSubstring(vol1))
 	})
 
+	It("with subpath volume", func() {
+		var args []string
+		volName := "vol-test1"
+		mkvol := podmanTest.Podman([]string{"volume", "create", volName})
+		mkvol.WaitWithDefaultTimeout()
+		Expect(mkvol).Should(ExitCleanly())
+
+		mountPoint := "/mnt"
+		filepath1 := "etc/etcfile"
+		dir1 := filepath.Join(mountPoint, "etc")
+		inFile1 := filepath.Join(mountPoint, filepath1)
+		exec1 := fmt.Sprintf("mkdir -p %s; touch %s", dir1, inFile1)
+
+		filepath2 := "var/varfile"
+		dir2 := filepath.Join(mountPoint, "var")
+		inFile2 := filepath.Join(dir2, "varfile")
+		exec2 := fmt.Sprintf("mkdir -p %s; touch %s", dir2, inFile2)
+
+		popvol := podmanTest.Podman([]string{"run", "-v", volName + ":" + mountPoint,
+			ALPINE, "sh", "-c", exec1 + ";" + exec2,
+		})
+		popvol.WaitWithDefaultTimeout()
+		Expect(popvol).Should(ExitCleanly())
+
+		mountTemplate := "type=volume,source=%s,volume-subpath=/%s,target=/%s"
+		args = []string{"run", "-d", "--pod", "new:test1", "--name", "test-ctr",
+			"--mount", fmt.Sprintf(mountTemplate, volName, filepath1, filepath1),
+			"--mount", fmt.Sprintf(mountTemplate, volName, filepath2, filepath2),
path: test/e2e/generate_kube_test.go
user: login: victortoso
body: Sure, I've updated it.
created_at: 2025-03-25T10:18:20Z
author_association: NONE
diff_hunk: @@ -849,6 +849,62 @@ var _ = Describe("Podman kube generate", func() {
 		Expect(inspect.OutputToString()).To(ContainSubstring(vol1))
 	})
 
+	It("with subpath volume", func() {
+		var args []string
+		volName := "vol-test1"
+		mkvol := podmanTest.Podman([]string{"volume", "create", volName})
+		mkvol.WaitWithDefaultTimeout()
+		Expect(mkvol).Should(ExitCleanly())
+
+		mountPoint := "/mnt"
+		filepath1 := "etc/etcfile"
+		dir1 := filepath.Join(mountPoint, "etc")
+		inFile1 := filepath.Join(mountPoint, filepath1)
+		exec1 := fmt.Sprintf("mkdir -p %s; touch %s", dir1, inFile1)
+
+		filepath2 := "var/varfile"
+		dir2 := filepath.Join(mountPoint, "var")
+		inFile2 := filepath.Join(dir2, "varfile")
+		exec2 := fmt.Sprintf("mkdir -p %s; touch %s", dir2, inFile2)
+
+		popvol := podmanTest.Podman([]string{"run", "-v", volName + ":" + mountPoint,
+			ALPINE, "sh", "-c", exec1 + ";" + exec2,
+		})
+		popvol.WaitWithDefaultTimeout()
+		Expect(popvol).Should(ExitCleanly())
+
+		mountTemplate := "type=volume,source=%s,volume-subpath=/%s,target=/%s"
+		args = []string{"run", "-d", "--pod", "new:test1", "--name", "test-ctr",
+			"--mount", fmt.Sprintf(mountTemplate, volName, filepath1, filepath1),
+			"--mount", fmt.Sprintf(mountTemplate, volName, filepath2, filepath2),
+			CITEST_IMAGE, "top"}
+
+		session1 := podmanTest.Podman(args)
+		session1.WaitWithDefaultTimeout()
+		Expect(session1).Should(ExitCleanly())
+
+		outputFile := filepath.Join(podmanTest.RunRoot, "pod.yaml")
+		kube := podmanTest.Podman([]string{"kube", "generate", "test1", "-f", outputFile})
+		kube.WaitWithDefaultTimeout()
+		Expect(kube).Should(ExitCleanly())
+
+		b, err := os.ReadFile(outputFile)
path: test/e2e/generate_kube_test.go
user: login: victortoso
body: Indeed it does. I had to use the `kube.OutputToStringArray()` and join them with `\n` but combined with `podmanTest.PodmanExitCleanly()` some code could be removed. Thanks!
created_at: 2025-03-25T10:20:08Z
author_association: NONE
diff_hunk: @@ -849,6 +849,62 @@ var _ = Describe("Podman kube generate", func() {
 		Expect(inspect.OutputToString()).To(ContainSubstring(vol1))
 	})
 
+	It("with subpath volume", func() {
+		var args []string
+		volName := "vol-test1"
+		mkvol := podmanTest.Podman([]string{"volume", "create", volName})
+		mkvol.WaitWithDefaultTimeout()
+		Expect(mkvol).Should(ExitCleanly())
+
+		mountPoint := "/mnt"
+		filepath1 := "etc/etcfile"
+		dir1 := filepath.Join(mountPoint, "etc")
+		inFile1 := filepath.Join(mountPoint, filepath1)
+		exec1 := fmt.Sprintf("mkdir -p %s; touch %s", dir1, inFile1)
+
+		filepath2 := "var/varfile"
+		dir2 := filepath.Join(mountPoint, "var")
+		inFile2 := filepath.Join(dir2, "varfile")
+		exec2 := fmt.Sprintf("mkdir -p %s; touch %s", dir2, inFile2)
+
+		popvol := podmanTest.Podman([]string{"run", "-v", volName + ":" + mountPoint,
path: test/e2e/generate_kube_test.go
user: login: victortoso
body: That indeed reduced quite a bit of checks. Thanks!
created_at: 2025-03-25T10:25:52Z
author_association: NONE
diff_hunk: @@ -849,6 +849,58 @@ var _ = Describe("Podman kube generate", func() {
 		Expect(inspect.OutputToString()).To(ContainSubstring(vol1))
 	})
 
+	It("with subpath volume", func() {
+		// We want to verify that generating Volume's subPath is working properly
+		// https://kubernetes.io/docs/concepts/storage/volumes/#using-subpath
+		// by creating a volume with two directories and mounthing them separately
+		volName := "vol-test1"
+		pvcName := fmt.Sprintf("%s-pvc", volName)
+		podmanTest.PodmanExitCleanly("volume", "create", volName)
+
+		mountPoint := "/mnt"
+
+		etcFile := "etcfile"
+		etcDirPath := filepath.Join(mountPoint, "etc")
+		etcSubPath := filepath.Join("/etc", etcFile)
+		etcMountSubPath := filepath.Join(mountPoint, etcSubPath)
+		populateEtcCmd := fmt.Sprintf("mkdir -p %s; touch %s", etcDirPath, etcMountSubPath)
+
+		varFile := "varfile"
+		varDirPath := filepath.Join(mountPoint, "var")
+		varSubPath := filepath.Join("/var", varFile)
+		varMountSubPath := filepath.Join(mountPoint, varSubPath)
+		populateVarCmd := fmt.Sprintf("mkdir -p %s; touch %s", varDirPath, varMountSubPath)
+
+		cmd := fmt.Sprintf("%s; %s", populateEtcCmd, populateVarCmd)
+		vol := fmt.Sprintf("%s:%s", volName, mountPoint)
+		podmanTest.PodmanExitCleanly("run", "-v", vol, ALPINE, "sh", "-c", cmd)
+
+		etcTargetPath := filepath.Join(mountPoint, etcFile)
+		varTargetPath := filepath.Join(mountPoint, varFile)
+		mountTemplate := "type=volume,source=%s,volume-subpath=%s,target=%s"
+		podmanTest.PodmanExitCleanly("run", "-d", "--pod", "new:test1", "--name", "test-ctr",
+			"--mount", fmt.Sprintf(mountTemplate, volName, etcSubPath, etcTargetPath),
+			"--mount", fmt.Sprintf(mountTemplate, volName, varSubPath, varTargetPath),
+			CITEST_IMAGE, "top")
+
+		kube := podmanTest.PodmanExitCleanly("kube", "generate", "test1")
+		yamlStr := strings.Join(kube.OutputToStringArray(), "\n")
+
+		pod := new(v1.Pod)
+		err = yaml.Unmarshal([]byte(yamlStr), pod)
path: test/e2e/generate_kube_test.go
user: login: Luap99
body: pass `kube.Out.Contents()` instead of having to split the entire string just to join it again.
created_at: 2025-03-25T10:49:12Z
author_association: MEMBER
diff_hunk: @@ -849,6 +849,58 @@ var _ = Describe("Podman kube generate", func() {
 		Expect(inspect.OutputToString()).To(ContainSubstring(vol1))
 	})
 
+	It("with subpath volume", func() {
+		// We want to verify that generating Volume's subPath is working properly
+		// https://kubernetes.io/docs/concepts/storage/volumes/#using-subpath
+		// by creating a volume with two directories and mounthing them separately
+		volName := "vol-test1"
+		pvcName := fmt.Sprintf("%s-pvc", volName)
+		podmanTest.PodmanExitCleanly("volume", "create", volName)
+
+		mountPoint := "/mnt"
+
+		etcFile := "etcfile"
+		etcDirPath := filepath.Join(mountPoint, "etc")
+		etcSubPath := filepath.Join("/etc", etcFile)
+		etcMountSubPath := filepath.Join(mountPoint, etcSubPath)
+		populateEtcCmd := fmt.Sprintf("mkdir -p %s; touch %s", etcDirPath, etcMountSubPath)
+
+		varFile := "varfile"
+		varDirPath := filepath.Join(mountPoint, "var")
+		varSubPath := filepath.Join("/var", varFile)
+		varMountSubPath := filepath.Join(mountPoint, varSubPath)
+		populateVarCmd := fmt.Sprintf("mkdir -p %s; touch %s", varDirPath, varMountSubPath)
+
+		cmd := fmt.Sprintf("%s; %s", populateEtcCmd, populateVarCmd)
+		vol := fmt.Sprintf("%s:%s", volName, mountPoint)
+		podmanTest.PodmanExitCleanly("run", "-v", vol, ALPINE, "sh", "-c", cmd)
+
+		etcTargetPath := filepath.Join(mountPoint, etcFile)
+		varTargetPath := filepath.Join(mountPoint, varFile)
+		mountTemplate := "type=volume,source=%s,volume-subpath=%s,target=%s"
+		podmanTest.PodmanExitCleanly("run", "-d", "--pod", "new:test1", "--name", "test-ctr",
+			"--mount", fmt.Sprintf(mountTemplate, volName, etcSubPath, etcTargetPath),
+			"--mount", fmt.Sprintf(mountTemplate, volName, varSubPath, varTargetPath),
+			CITEST_IMAGE, "top")
+
+		kube := podmanTest.PodmanExitCleanly("kube", "generate", "test1")
+		yamlStr := strings.Join(kube.OutputToStringArray(), "\n")
+
+		pod := new(v1.Pod)
+		err = yaml.Unmarshal([]byte(yamlStr), pod)
path: test/e2e/generate_kube_test.go
user: login: victortoso
body: Thanks, I missed that function.
created_at: 2025-03-25T10:59:51Z
author_association: NONE

PR comments:
user: login: baude
created_at: 2025-03-24T18:01:03Z
body: /approve

thanks for the contribution @victortoso ... would you be willing to narrate/comment in your test so someone unfamiliar with this would be able understand whats going on in there?
author_association: MEMBER
user: login: victortoso
created_at: 2025-03-25T10:25:25Z
body: Hi @baude  thanks for the quick review!

> thanks for the contribution @victortoso ... would you be willing to narrate/comment in your test so someone unfamiliar with this would be able understand whats going on in there?

I've updated the commit log, the first comment and add a small note in the test. Let me know if I've missed something.
author_association: NONE
user: login: openshift-ci[bot]
created_at: 2025-03-25T11:02:54Z
body: [APPROVALNOTIFIER] This PR is **APPROVED**

This pull-request has been approved by: *<a href="https://github.com/containers/podman/pull/25664#issuecomment-2748988667" title="Approved">baude</a>*, *<a href="https://github.com/containers/podman/pull/25664#pullrequestreview-2713308877" title="Approved">Luap99</a>*, *<a href="https://github.com/containers/podman/pull/25664#" title="Author self-approved">victortoso</a>*

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=containers%2Fpodman).

The pull request process is described [here](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process)

<details >
Needs approval from an approver in each of these files:

- ~~[OWNERS](https://github.com/containers/podman/blob/main/OWNERS)~~ [Luap99,baude]

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":[]} -->
author_association: CONTRIBUTOR
user: login: rhatdan
created_at: 2025-03-25T14:30:18Z
body: Thanks @victortoso 
/lgtm
author_association: MEMBER