code: func NewContainerRuntime(execer utilsexec.Interface, criSocket string) (ContainerRuntime, error) {
  	var toolName string
  	var runtime ContainerRuntime
  
  	if criSocket != constants.DefaultDockerCRISocket {
  		toolName = "crictl"
  		// !!! temporary work around crictl warning:
  		// Using "/var/run/crio/crio.sock" as endpoint is deprecated,
  		// please consider using full url format "unix:///var/run/crio/crio.sock"
  		if filepath.IsAbs(criSocket) && goruntime.GOOS != "windows" {
  			criSocket = "unix://" + criSocket
  		}
  		runtime = &CRIRuntime{execer, criSocket}
  	} else {
  		toolName = "docker"
  		runtime = &DockerRuntime{execer}
  	}
  
  	if _, err := execer.LookPath(toolName); err != nil {
  		return nil, errors.Wrapf(err, "%s is required for container runtime", toolName)
  	}
  
  	return runtime, nil
  }
docs: // NewContainerRuntime sets up and returns a ContainerRuntime struct