mirror of
https://github.com/containers/podman.git
synced 2025-06-07 07:45:34 +08:00
Merge pull request #10638 from Luap99/volume
Fix volumes with uid and gid options
This commit is contained in:
@ -1641,6 +1641,19 @@ func WithVolumeGID(gid int) VolumeCreateOption {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WithVolumeNoChown prevents the volume from being chowned to the process uid at first use.
|
||||||
|
func WithVolumeNoChown() VolumeCreateOption {
|
||||||
|
return func(volume *Volume) error {
|
||||||
|
if volume.valid {
|
||||||
|
return define.ErrVolumeFinalized
|
||||||
|
}
|
||||||
|
|
||||||
|
volume.state.NeedsChown = false
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// withSetAnon sets a bool notifying libpod that this volume is anonymous and
|
// withSetAnon sets a bool notifying libpod that this volume is anonymous and
|
||||||
// should be removed when containers using it are removed and volumes are
|
// should be removed when containers using it are removed and volumes are
|
||||||
// specified for removal.
|
// specified for removal.
|
||||||
|
@ -39,8 +39,23 @@ func (v *Volume) needsMount() bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// Local driver with options needs mount
|
// Commit 28138dafcc added the UID and GID options to this map
|
||||||
return len(v.config.Options) > 0
|
// However we should only mount when options other than uid and gid are set.
|
||||||
|
// see https://github.com/containers/podman/issues/10620
|
||||||
|
index := 0
|
||||||
|
if _, ok := v.config.Options["UID"]; ok {
|
||||||
|
index++
|
||||||
|
}
|
||||||
|
if _, ok := v.config.Options["GID"]; ok {
|
||||||
|
index++
|
||||||
|
}
|
||||||
|
// when uid or gid is set there is also the "o" option
|
||||||
|
// set so we have to ignore this one as well
|
||||||
|
if index > 0 {
|
||||||
|
index++
|
||||||
|
}
|
||||||
|
// Local driver with options other than uid,gid needs mount
|
||||||
|
return len(v.config.Options) > index
|
||||||
}
|
}
|
||||||
|
|
||||||
// update() updates the volume state from the DB.
|
// update() updates the volume state from the DB.
|
||||||
|
@ -37,7 +37,7 @@ func VolumeOptions(opts map[string]string) ([]libpod.VolumeCreateOption, error)
|
|||||||
return nil, errors.Wrapf(err, "cannot convert UID %s to integer", splitO[1])
|
return nil, errors.Wrapf(err, "cannot convert UID %s to integer", splitO[1])
|
||||||
}
|
}
|
||||||
logrus.Debugf("Removing uid= from options and adding WithVolumeUID for UID %d", intUID)
|
logrus.Debugf("Removing uid= from options and adding WithVolumeUID for UID %d", intUID)
|
||||||
libpodOptions = append(libpodOptions, libpod.WithVolumeUID(intUID))
|
libpodOptions = append(libpodOptions, libpod.WithVolumeUID(intUID), libpod.WithVolumeNoChown())
|
||||||
finalVal = append(finalVal, o)
|
finalVal = append(finalVal, o)
|
||||||
// set option "UID": "$uid"
|
// set option "UID": "$uid"
|
||||||
volumeOptions["UID"] = splitO[1]
|
volumeOptions["UID"] = splitO[1]
|
||||||
@ -50,7 +50,7 @@ func VolumeOptions(opts map[string]string) ([]libpod.VolumeCreateOption, error)
|
|||||||
return nil, errors.Wrapf(err, "cannot convert GID %s to integer", splitO[1])
|
return nil, errors.Wrapf(err, "cannot convert GID %s to integer", splitO[1])
|
||||||
}
|
}
|
||||||
logrus.Debugf("Removing gid= from options and adding WithVolumeGID for GID %d", intGID)
|
logrus.Debugf("Removing gid= from options and adding WithVolumeGID for GID %d", intGID)
|
||||||
libpodOptions = append(libpodOptions, libpod.WithVolumeGID(intGID))
|
libpodOptions = append(libpodOptions, libpod.WithVolumeGID(intGID), libpod.WithVolumeNoChown())
|
||||||
finalVal = append(finalVal, o)
|
finalVal = append(finalVal, o)
|
||||||
// set option "GID": "$gid"
|
// set option "GID": "$gid"
|
||||||
volumeOptions["GID"] = splitO[1]
|
volumeOptions["GID"] = splitO[1]
|
||||||
|
@ -668,4 +668,36 @@ USER testuser`, fedoraMinimal)
|
|||||||
Expect(strings.Contains(test2.OutputToString(), testString)).To(BeTrue())
|
Expect(strings.Contains(test2.OutputToString(), testString)).To(BeTrue())
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("podman volume with uid and gid works", func() {
|
||||||
|
volName := "testVol"
|
||||||
|
volCreate := podmanTest.Podman([]string{"volume", "create", "--opt", "o=uid=1000", volName})
|
||||||
|
volCreate.WaitWithDefaultTimeout()
|
||||||
|
Expect(volCreate.ExitCode()).To(Equal(0))
|
||||||
|
|
||||||
|
volMount := podmanTest.Podman([]string{"run", "--rm", "-v", fmt.Sprintf("%s:/test", volName), ALPINE, "stat", "-c", "%u", "/test"})
|
||||||
|
volMount.WaitWithDefaultTimeout()
|
||||||
|
Expect(volMount.ExitCode()).To(Equal(0))
|
||||||
|
Expect(volMount.OutputToString()).To(Equal("1000"))
|
||||||
|
|
||||||
|
volName = "testVol2"
|
||||||
|
volCreate = podmanTest.Podman([]string{"volume", "create", "--opt", "o=gid=1000", volName})
|
||||||
|
volCreate.WaitWithDefaultTimeout()
|
||||||
|
Expect(volCreate.ExitCode()).To(Equal(0))
|
||||||
|
|
||||||
|
volMount = podmanTest.Podman([]string{"run", "--rm", "-v", fmt.Sprintf("%s:/test", volName), ALPINE, "stat", "-c", "%g", "/test"})
|
||||||
|
volMount.WaitWithDefaultTimeout()
|
||||||
|
Expect(volMount.ExitCode()).To(Equal(0))
|
||||||
|
Expect(volMount.OutputToString()).To(Equal("1000"))
|
||||||
|
|
||||||
|
volName = "testVol3"
|
||||||
|
volCreate = podmanTest.Podman([]string{"volume", "create", "--opt", "o=uid=1000,gid=1000", volName})
|
||||||
|
volCreate.WaitWithDefaultTimeout()
|
||||||
|
Expect(volCreate.ExitCode()).To(Equal(0))
|
||||||
|
|
||||||
|
volMount = podmanTest.Podman([]string{"run", "--rm", "-v", fmt.Sprintf("%s:/test", volName), ALPINE, "stat", "-c", "%u:%g", "/test"})
|
||||||
|
volMount.WaitWithDefaultTimeout()
|
||||||
|
Expect(volMount.ExitCode()).To(Equal(0))
|
||||||
|
Expect(volMount.OutputToString()).To(Equal("1000:1000"))
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
Reference in New Issue
Block a user