code: 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
  }
docs: // setupUser changes the groups, gid, and uid for the user inside the container