init_linux.go
func setupUser(config *initConfig) error {
	// Set up defaults.
	defaultExecUser := user.ExecUser{
		Uid:  syscall.Getuid(),
		Gid:  syscall.Getgid(),
		Home: "/",
	}
	passwdPath, err := user.GetPasswdPath()
	if err != nil {
		return err
	}
	groupPath, err := user.GetGroupPath()
	if err != nil {
		return err
	}
	execUser, err := user.GetExecUserPath(config.User, &defaultExecUser, passwdPath, groupPath)
	if err != nil {
		return err
	}

	var addGroups []int
	if len(config.Config.AdditionalGroups) > 0 {
		addGroups, err = user.GetAdditionalGroupsPath(config.Config.AdditionalGroups, groupPath)
		if err != nil {
			return err
		}
	}

	suppGroups := append(execUser.Sgids, addGroups...)
	if err := syscall.Setgroups(suppGroups); err != nil {
		return err
	}

	if err := system.Setgid(execUser.Gid); err != nil {
		return err
	}
	if err := system.Setuid(execUser.Uid); err != nil {
		return err
	}
	// if we didn't get HOME already, set it based on the user's HOME
	if envHome := os.Getenv("HOME"); envHome == "" {
		if err := os.Setenv("HOME", execUser.Home); err != nil {
			return err
		}
	}
	return nil
}
func setupUser(config *initConfig) error {
	// Set up defaults.
	defaultExecUser := user.ExecUser{
		Uid:  syscall.Getuid(),
		Gid:  syscall.Getgid(),
		Home: "/",
	}
	passwdPath, err := user.GetPasswdPath()
	if err != nil {
		return err
	}
	groupPath, err := user.GetGroupPath()
	if err != nil {
		return err
	}
	execUser, err := user.GetExecUserPath(config.User, &defaultExecUser, passwdPath, groupPath)
	if err != nil {
		return err
	}

	var addGroups []int
	if len(config.Config.AdditionalGroups) > 0 {
		addGroups, err = user.GetAdditionalGroupsPath(config.Config.AdditionalGroups, groupPath)
		if err != nil {
			return err
		}
	}

	suppGroups := append(execUser.Sgids, addGroups...)
	if err := syscall.Setgroups(suppGroups); err != nil {
		return err
	}

	if err := system.Setgid(execUser.Gid); err != nil {
		return err
	}
	if err := system.Setuid(execUser.Uid); err != nil {
		return err
	}
	// if we didn't get HOME already, set it based on the user's HOME
	if envHome := os.Getenv("HOME"); envHome == "" {
		if err := os.Setenv("HOME", execUser.Home); err != nil {
			return err
		}
	}
	return nil
}
func setupUser ( config * initConfig ) error { // Set up defaults. defaultExecUser := user . ExecUser { Uid : syscall . Getuid ( ) , Gid : syscall . Getgid ( ) , Home : " " , } passwdPath , err := user . GetPasswdPath ( ) if err != nil { return err } groupPath , err := user . GetGroupPath ( ) if err != nil { return err } execUser , err := user . GetExecUserPath ( config . User , & defaultExecUser , passwdPath , groupPath ) if err != nil { return err } var addGroups [ ] int if len ( config . Config . AdditionalGroups ) > 0 { addGroups , err = user . GetAdditionalGroupsPath ( config . Config . AdditionalGroups , groupPath ) if err != nil { return err } } suppGroups := append ( execUser . Sgids , addGroups ... ) if err := syscall . Setgroups ( suppGroups ) ; err != nil { return err } if err := system . Setgid ( execUser . Gid ) ; err != nil { return err } if err := system . Setuid ( execUser . Uid ) ; err != nil { return err } // if we didn't get HOME already, set it based on the user's HOME if envHome := os . Getenv ( " " ) ; envHome == " " { if err := os . Setenv ( " " , execUser . Home ) ; err != nil { return err } } return nil }
// setupUser changes the groups, gid, and uid for the user inside the container
setupUser changes the groups gid and uid for the user inside the container