mirror of
https://github.com/containers/podman.git
synced 2025-12-01 18:49:18 +08:00
overlay-volumes: add support for non-volatile upperdir,workdir for anonymous volumes
Similar feature was added for named overlay volumes here: https://github.com/containers/podman/pull/12712 Following PR just mimics similar feature for anonymous volumes. Often users want their anonymous overlayed volumes to be `non-volatile` in nature that means that same `upper` dir can be re-used by one or more containers but overall of nature of volumes still have to be overlay so work done is still on a overlay not on the actual volume. Following PR adds support for more advanced options i.e custom `workdir` and `upperdir` for overlayed volumes. So that users can re-use `workdir` and `upperdir` across new containers as well. Usage ```console podman run -it -v /some/path:/data:O,upperdir=/path/persistant/upper,workdir=/path/persistant/work alpine sh ``` Signed-off-by: Aditya R <arajan@redhat.com>
This commit is contained in:
@@ -325,6 +325,51 @@ var _ = Describe("Podman run with volumes", func() {
|
||||
|
||||
})
|
||||
|
||||
It("podman support overlay volume with custom upperdir and workdir", func() {
|
||||
SkipIfRemote("Overlay volumes only work locally")
|
||||
if os.Getenv("container") != "" {
|
||||
Skip("Overlay mounts not supported when running in a container")
|
||||
}
|
||||
if rootless.IsRootless() {
|
||||
if _, err := exec.LookPath("fuse-overlayfs"); err != nil {
|
||||
Skip("Fuse-Overlayfs required for rootless overlay mount test")
|
||||
}
|
||||
}
|
||||
|
||||
// Use bindsource instead of named volume
|
||||
bindSource := filepath.Join(tempdir, "bindsource")
|
||||
err := os.Mkdir(bindSource, 0755)
|
||||
Expect(err).To(BeNil(), "mkdir "+bindSource)
|
||||
|
||||
// create persistent upperdir on host
|
||||
upperDir := filepath.Join(tempdir, "upper")
|
||||
err = os.Mkdir(upperDir, 0755)
|
||||
Expect(err).To(BeNil(), "mkdir "+upperDir)
|
||||
|
||||
// create persistent workdir on host
|
||||
workDir := filepath.Join(tempdir, "work")
|
||||
err = os.Mkdir(workDir, 0755)
|
||||
Expect(err).To(BeNil(), "mkdir "+workDir)
|
||||
|
||||
overlayOpts := fmt.Sprintf("upperdir=%s,workdir=%s", upperDir, workDir)
|
||||
|
||||
// create file on overlay volume
|
||||
session := podmanTest.Podman([]string{"run", "--volume", bindSource + ":/data:O," + overlayOpts, ALPINE, "sh", "-c", "echo hello >> " + "/data/overlay"})
|
||||
session.WaitWithDefaultTimeout()
|
||||
Expect(session).Should(Exit(0))
|
||||
|
||||
session = podmanTest.Podman([]string{"run", "--volume", bindSource + ":/data:O," + overlayOpts, ALPINE, "sh", "-c", "ls /data"})
|
||||
session.WaitWithDefaultTimeout()
|
||||
// must contain `overlay` file since it should be persistent on specified upper and workdir
|
||||
Expect(session.OutputToString()).To(ContainSubstring("overlay"))
|
||||
|
||||
session = podmanTest.Podman([]string{"run", "--volume", bindSource + ":/data:O", ALPINE, "sh", "-c", "ls /data"})
|
||||
session.WaitWithDefaultTimeout()
|
||||
// must not contain `overlay` file which was on custom upper and workdir since we have not specified any upper or workdir
|
||||
Expect(session.OutputToString()).To(Not(ContainSubstring("overlay")))
|
||||
|
||||
})
|
||||
|
||||
It("podman run with noexec can't exec", func() {
|
||||
session := podmanTest.Podman([]string{"run", "--rm", "-v", "/bin:/hostbin:noexec", ALPINE, "/hostbin/ls", "/"})
|
||||
session.WaitWithDefaultTimeout()
|
||||
|
||||
Reference in New Issue
Block a user