code: func (i *ImageService) PullImage(ctx context.Context, image, tag string, platform *specs.Platform, metaHeaders map[string][]string, authConfig *types.AuthConfig, outStream io.Writer) error {
  	start := time.Now()
  	// Special case: "pull -a" may send an image name with a
  	// trailing :. This is ugly, but let's not break API
  	// compatibility.
  	image = strings.TrimSuffix(image, ":")
  
  	ref, err := reference.ParseNormalizedNamed(image)
  	if err != nil {
  		return errdefs.InvalidParameter(err)
  	}
  
  	if tag != "" {
  		// The "tag" could actually be a digest.
  		var dgst digest.Digest
  		dgst, err = digest.Parse(tag)
  		if err == nil {
  			ref, err = reference.WithDigest(reference.TrimNamed(ref), dgst)
  		} else {
  			ref, err = reference.WithTag(ref, tag)
  		}
  		if err != nil {
  			return errdefs.InvalidParameter(err)
  		}
  	}
  
  	err = i.pullImageWithReference(ctx, ref, platform, metaHeaders, authConfig, outStream)
  	imageActions.WithValues("pull").UpdateSince(start)
  	return err
  }
docs: // PullImage initiates a pull operation. image is the repository name to pull, and
  // tag may be either empty, or indicate a specific tag to pull.