code: func (engine *DockerTaskEngine) imagePullRequired(imagePullBehavior config.ImagePullBehaviorType,
  	container *apicontainer.Container,
  	taskArn string) bool {
  	switch imagePullBehavior {
  	case config.ImagePullOnceBehavior:
  		// If this image has been pulled successfully before, don't pull the image,
  		// otherwise pull the image as usual, regardless whether the image exists or not
  		// (the image can be prepopulated with the AMI and never be pulled).
  		imageState, ok := engine.imageManager.GetImageStateFromImageName(container.Image)
  		if ok && imageState.GetPullSucceeded() {
  			seelog.Infof("Task engine [%s]: image %s for container %s has been pulled once, not pulling it again",
  				taskArn, container.Image, container.Name)
  			return false
  		}
  		return true
  	case config.ImagePullPreferCachedBehavior:
  		// If the behavior is prefer cached, don't pull if we found cached image
  		// by inspecting the image.
  		_, err := engine.client.InspectImage(container.Image)
  		if err != nil {
  			return true
  		}
  		seelog.Infof("Task engine [%s]: found cached image %s, use it directly for container %s",
  			taskArn, container.Image, container.Name)
  		return false
  	default:
  		// Need to pull the image for always and default agent pull behavior
  		return true
  	}
  }
docs: // imagePullRequired returns true if pulling image is required, or return false if local image cache
  // should be used, by inspecting the agent pull behavior variable defined in config. The caller has
  // to make sure the container passed in is not an internal container.