diff options
author | OpenShift Merge Robot <openshift-merge-robot@users.noreply.github.com> | 2021-09-21 10:50:40 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-21 10:50:40 -0400 |
commit | b922e61cec379c136d4138f13e4fc44d2fa3df11 (patch) | |
tree | c1fb5bdc874cf668ee090e6451936d9837ae5005 /libpod | |
parent | 9b5522d9adff9e8b2413e626bfc62d1df28ce534 (diff) | |
parent | ae5de8b390693784fc383b4d1df85aa92104f481 (diff) | |
download | podman-b922e61cec379c136d4138f13e4fc44d2fa3df11.tar.gz podman-b922e61cec379c136d4138f13e4fc44d2fa3df11.tar.bz2 podman-b922e61cec379c136d4138f13e4fc44d2fa3df11.zip |
Merge pull request #11650 from flouthoc/named-volume-overlay
volume: Add support for overlay on named volumes
Diffstat (limited to 'libpod')
-rw-r--r-- | libpod/container_internal_linux.go | 45 |
1 files changed, 39 insertions, 6 deletions
diff --git a/libpod/container_internal_linux.go b/libpod/container_internal_linux.go index dbecea031..0a663200a 100644 --- a/libpod/container_internal_linux.go +++ b/libpod/container_internal_linux.go @@ -369,13 +369,46 @@ func (c *Container) generateSpec(ctx context.Context) (*spec.Spec, error) { if err != nil { return nil, err } - volMount := spec.Mount{ - Type: "bind", - Source: mountPoint, - Destination: namedVol.Dest, - Options: namedVol.Options, + + overlayFlag := false + for _, o := range namedVol.Options { + if o == "O" { + overlayFlag = true + } + } + + if overlayFlag { + contentDir, err := overlay.TempDir(c.config.StaticDir, c.RootUID(), c.RootGID()) + if err != nil { + return nil, err + } + overlayMount, err := overlay.Mount(contentDir, mountPoint, namedVol.Dest, c.RootUID(), c.RootGID(), c.runtime.store.GraphOptions()) + if err != nil { + return nil, errors.Wrapf(err, "mounting overlay failed %q", mountPoint) + } + + for _, o := range namedVol.Options { + switch o { + case "U": + if err := chown.ChangeHostPathOwnership(mountPoint, true, int(hostUID), int(hostGID)); err != nil { + return nil, err + } + + if err := chown.ChangeHostPathOwnership(contentDir, true, int(hostUID), int(hostGID)); err != nil { + return nil, err + } + } + } + g.AddMount(overlayMount) + } else { + volMount := spec.Mount{ + Type: "bind", + Source: mountPoint, + Destination: namedVol.Dest, + Options: namedVol.Options, + } + g.AddMount(volMount) } - g.AddMount(volMount) } // Check if the spec file mounts contain the options z, Z or U. |