|
@@ -91,6 +91,7 @@ func parseUID(str string) (uint32, error) {
|
|
// once the PR in containerd is merged we should remove this function.
|
|
// once the PR in containerd is merged we should remove this function.
|
|
func WithUIDGID(uid, gid uint32, sgids []uint32) containerdoci.SpecOpts {
|
|
func WithUIDGID(uid, gid uint32, sgids []uint32) containerdoci.SpecOpts {
|
|
return func(_ context.Context, _ containerdoci.Client, _ *containers.Container, s *containerdoci.Spec) error {
|
|
return func(_ context.Context, _ containerdoci.Client, _ *containers.Container, s *containerdoci.Spec) error {
|
|
|
|
+ defer ensureAdditionalGids(s)
|
|
setProcess(s)
|
|
setProcess(s)
|
|
s.Process.User.UID = uid
|
|
s.Process.User.UID = uid
|
|
s.Process.User.GID = gid
|
|
s.Process.User.GID = gid
|
|
@@ -106,3 +107,15 @@ func setProcess(s *containerdoci.Spec) {
|
|
s.Process = &specs.Process{}
|
|
s.Process = &specs.Process{}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+// ensureAdditionalGids ensures that the primary GID is also included in the additional GID list.
|
|
|
|
+// From https://github.com/containerd/containerd/blob/v1.7.0-beta.4/oci/spec_opts.go#L124-L133
|
|
|
|
+func ensureAdditionalGids(s *containerdoci.Spec) {
|
|
|
|
+ setProcess(s)
|
|
|
|
+ for _, f := range s.Process.User.AdditionalGids {
|
|
|
|
+ if f == s.Process.User.GID {
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ s.Process.User.AdditionalGids = append([]uint32{s.Process.User.GID}, s.Process.User.AdditionalGids...)
|
|
|
|
+}
|