summaryrefslogtreecommitdiff
path: root/libpod
diff options
context:
space:
mode:
authorOpenShift Merge Robot <openshift-merge-robot@users.noreply.github.com>2021-09-21 10:50:40 -0400
committerGitHub <noreply@github.com>2021-09-21 10:50:40 -0400
commitb922e61cec379c136d4138f13e4fc44d2fa3df11 (patch)
treec1fb5bdc874cf668ee090e6451936d9837ae5005 /libpod
parent9b5522d9adff9e8b2413e626bfc62d1df28ce534 (diff)
parentae5de8b390693784fc383b4d1df85aa92104f481 (diff)
downloadpodman-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.go45
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.