@@ -629,11 +629,8 @@ func WithUIDGID(uid, gid uint32) SpecOpts {
629
629
func WithUserID (uid uint32 ) SpecOpts {
630
630
return func (ctx context.Context , client Client , c * containers.Container , s * Spec ) (err error ) {
631
631
setProcess (s )
632
- if c .Snapshotter == "" && c .SnapshotKey == "" {
633
- if ! isRootfsAbs (s .Root .Path ) {
634
- return errors .New ("rootfs absolute path is required" )
635
- }
636
- user , err := UserFromPath (s .Root .Path , func (u user.User ) bool {
632
+ setUser := func (root string ) error {
633
+ user , err := UserFromPath (root , func (u user.User ) bool {
637
634
return u .Uid == int (uid )
638
635
})
639
636
if err != nil {
@@ -645,7 +642,12 @@ func WithUserID(uid uint32) SpecOpts {
645
642
}
646
643
s .Process .User .UID , s .Process .User .GID = uint32 (user .Uid ), uint32 (user .Gid )
647
644
return nil
648
-
645
+ }
646
+ if c .Snapshotter == "" && c .SnapshotKey == "" {
647
+ if ! isRootfsAbs (s .Root .Path ) {
648
+ return errors .New ("rootfs absolute path is required" )
649
+ }
650
+ return setUser (s .Root .Path )
649
651
}
650
652
if c .Snapshotter == "" {
651
653
return errors .New ("no snapshotter set for container" )
@@ -660,20 +662,7 @@ func WithUserID(uid uint32) SpecOpts {
660
662
}
661
663
662
664
mounts = tryReadonlyMounts (mounts )
663
- return mount .WithTempMount (ctx , mounts , func (root string ) error {
664
- user , err := UserFromPath (root , func (u user.User ) bool {
665
- return u .Uid == int (uid )
666
- })
667
- if err != nil {
668
- if os .IsNotExist (err ) || err == ErrNoUsersFound {
669
- s .Process .User .UID , s .Process .User .GID = uid , 0
670
- return nil
671
- }
672
- return err
673
- }
674
- s .Process .User .UID , s .Process .User .GID = uint32 (user .Uid ), uint32 (user .Gid )
675
- return nil
676
- })
665
+ return mount .WithTempMount (ctx , mounts , setUser )
677
666
}
678
667
}
679
668
@@ -687,11 +676,8 @@ func WithUsername(username string) SpecOpts {
687
676
return func (ctx context.Context , client Client , c * containers.Container , s * Spec ) (err error ) {
688
677
setProcess (s )
689
678
if s .Linux != nil {
690
- if c .Snapshotter == "" && c .SnapshotKey == "" {
691
- if ! isRootfsAbs (s .Root .Path ) {
692
- return errors .New ("rootfs absolute path is required" )
693
- }
694
- user , err := UserFromPath (s .Root .Path , func (u user.User ) bool {
679
+ setUser := func (root string ) error {
680
+ user , err := UserFromPath (root , func (u user.User ) bool {
695
681
return u .Name == username
696
682
})
697
683
if err != nil {
@@ -700,6 +686,12 @@ func WithUsername(username string) SpecOpts {
700
686
s .Process .User .UID , s .Process .User .GID = uint32 (user .Uid ), uint32 (user .Gid )
701
687
return nil
702
688
}
689
+ if c .Snapshotter == "" && c .SnapshotKey == "" {
690
+ if ! isRootfsAbs (s .Root .Path ) {
691
+ return errors .New ("rootfs absolute path is required" )
692
+ }
693
+ return setUser (s .Root .Path )
694
+ }
703
695
if c .Snapshotter == "" {
704
696
return errors .New ("no snapshotter set for container" )
705
697
}
@@ -713,16 +705,7 @@ func WithUsername(username string) SpecOpts {
713
705
}
714
706
715
707
mounts = tryReadonlyMounts (mounts )
716
- return mount .WithTempMount (ctx , mounts , func (root string ) error {
717
- user , err := UserFromPath (root , func (u user.User ) bool {
718
- return u .Name == username
719
- })
720
- if err != nil {
721
- return err
722
- }
723
- s .Process .User .UID , s .Process .User .GID = uint32 (user .Uid ), uint32 (user .Gid )
724
- return nil
725
- })
708
+ return mount .WithTempMount (ctx , mounts , setUser )
726
709
} else if s .Windows != nil {
727
710
s .Process .User .Username = username
728
711
} else {
0 commit comments