File tree Expand file tree Collapse file tree 2 files changed +45
-3
lines changed Expand file tree Collapse file tree 2 files changed +45
-3
lines changed Original file line number Diff line number Diff line change @@ -21,6 +21,7 @@ import (
2121 "fmt"
2222 "os"
2323 "path/filepath"
24+ "slices"
2425 "sort"
2526 "strings"
2627
@@ -114,9 +115,18 @@ func (e *ContainerEdits) Apply(spec *oci.Spec) error {
114115 }
115116
116117 if len (e .Mounts ) > 0 {
118+ var (
119+ uids []oci.LinuxIDMapping
120+ gids []oci.LinuxIDMapping
121+ )
122+
123+ if specHasUserNamespace (spec ) {
124+ uids = slices .Clone (spec .Linux .UIDMappings )
125+ gids = slices .Clone (spec .Linux .GIDMappings )
126+ }
117127 for _ , m := range e .Mounts {
118128 specgen .RemoveMount (m .ContainerPath )
119- specgen .AddMount ((& Mount {m }).toOCI ())
129+ specgen .AddMount ((& Mount {m }).toOCI (withMountIDMappings ( uids , gids ) ))
120130 }
121131 sortMounts (& specgen )
122132 }
@@ -387,3 +397,16 @@ func (m orderedMounts) Swap(i, j int) {
387397func (m orderedMounts ) parts (i int ) int {
388398 return strings .Count (filepath .Clean (m [i ].Destination ), string (os .PathSeparator ))
389399}
400+
401+ // specHasUserNamespace returns true ifthe OCI Spec has a Linux UserNamespace.
402+ func specHasUserNamespace (spec * oci.Spec ) bool {
403+ if spec == nil || spec .Linux == nil {
404+ return false
405+ }
406+ for _ , ns := range spec .Linux .Namespaces {
407+ if ns .Type == oci .UserNamespace {
408+ return true
409+ }
410+ }
411+ return false
412+ }
Original file line number Diff line number Diff line change @@ -30,14 +30,33 @@ func (h *Hook) toOCI() spec.Hook {
3030 }
3131}
3232
33+ // Extra OCI mount option to apply to injected mounts.
34+ type extraOCIMountOption func (* spec.Mount )
35+
36+ // withMountIDMappings adds UID and GID mappings for the given mount.
37+ func withMountIDMappings (uid , gid []spec.LinuxIDMapping ) extraOCIMountOption {
38+ return func (m * spec.Mount ) {
39+ if uid != nil {
40+ m .UIDMappings = uid
41+ }
42+ if gid != nil {
43+ m .GIDMappings = gid
44+ }
45+ }
46+ }
47+
3348// toOCI returns the opencontainers runtime Spec Mount for this Mount.
34- func (m * Mount ) toOCI () spec.Mount {
35- return spec.Mount {
49+ func (m * Mount ) toOCI (options ... extraOCIMountOption ) spec.Mount {
50+ om := spec.Mount {
3651 Source : m .HostPath ,
3752 Destination : m .ContainerPath ,
3853 Options : m .Options ,
3954 Type : m .Type ,
4055 }
56+ for _ , o := range options {
57+ o (& om )
58+ }
59+ return om
4160}
4261
4362// toOCI returns the opencontainers runtime Spec LinuxDevice for this DeviceNode.
You can’t perform that action at this time.
0 commit comments