code: func (b *Builder) Run(step *Step, exec Executor, noRunsRemaining bool) error {
  	fn, ok := evaluateTable[step.Command]
  	if !ok {
  		return exec.UnrecognizedInstruction(step)
  	}
  	if err := fn(b, step.Args, step.Attrs, step.Flags, step.Original); err != nil {
  		return err
  	}
  
  	copies := b.PendingCopies
  	b.PendingCopies = nil
  	runs := b.PendingRuns
  	b.PendingRuns = nil
  
  	// Once a VOLUME is defined, future ADD/COPY instructions are
  	// all that may mutate that path. Instruct the executor to preserve
  	// the path. The executor must handle invalidating preserved info.
  	for _, path := range b.PendingVolumes {
  		if b.Volumes.Add(path) && !noRunsRemaining {
  			if err := exec.Preserve(path); err != nil {
  				return err
  			}
  		}
  	}
  
  	if err := exec.Copy(b.Excludes, copies...); err != nil {
  		return err
  	}
  
  	if len(b.RunConfig.WorkingDir) > 0 {
  		if err := exec.EnsureContainerPath(b.RunConfig.WorkingDir); err != nil {
  			return err
  		}
  	}
  
  	for _, run := range runs {
  		config := b.Config()
  		config.Env = step.Env
  		if err := exec.Run(run, *config); err != nil {
  			return err
  		}
  	}
  
  	return nil
  }
docs: // Run executes a step, transforming the current builder and
  // invoking any Copy or Run operations. noRunsRemaining is an
  // optimization hint that allows the builder to avoid performing
  // unnecessary work.