code: func NewDockerTaskEngine(cfg *config.Config,
  	client dockerapi.DockerClient,
  	credentialsManager credentials.Manager,
  	containerChangeEventStream *eventstream.EventStream,
  	imageManager ImageManager,
  	state dockerstate.TaskEngineState,
  	metadataManager containermetadata.Manager,
  	resourceFields *taskresource.ResourceFields) *DockerTaskEngine {
  	dockerTaskEngine := &DockerTaskEngine{
  		cfg:    cfg,
  		client: client,
  		saver:  statemanager.NewNoopStateManager(),
  
  		state:         state,
  		managedTasks:  make(map[string]*managedTask),
  		taskStopGroup: utilsync.NewSequentialWaitGroup(),
  
  		stateChangeEvents: make(chan statechange.Event),
  
  		credentialsManager: credentialsManager,
  
  		containerChangeEventStream: containerChangeEventStream,
  		imageManager:               imageManager,
  		cniClient: ecscni.NewClient(&ecscni.Config{
  			PluginsPath:            cfg.CNIPluginsPath,
  			MinSupportedCNIVersion: config.DefaultMinSupportedCNIVersion,
  		}),
  
  		metadataManager:             metadataManager,
  		taskSteadyStatePollInterval: defaultTaskSteadyStatePollInterval,
  		resourceFields:              resourceFields,
  	}
  
  	dockerTaskEngine.initializeContainerStatusToTransitionFunction()
  
  	return dockerTaskEngine
  }
docs: // NewDockerTaskEngine returns a created, but uninitialized, DockerTaskEngine.
  // The distinction between created and initialized is that when created it may
  // be serialized/deserialized, but it will not communicate with docker until it
  // is also initialized.