code: func (engine *DockerTaskEngine) Init(ctx context.Context) error {
  	// TODO, pass in a a context from main from background so that other things can stop us, not just the tests
  	derivedCtx, cancel := context.WithCancel(ctx)
  	engine.stopEngine = cancel
  
  	engine.ctx = derivedCtx
  
  	// Open the event stream before we sync state so that e.g. if a container
  	// goes from running to stopped after we sync with it as "running" we still
  	// have the "went to stopped" event pending so we can be up to date.
  	err := engine.openEventstream(derivedCtx)
  	if err != nil {
  		return err
  	}
  	engine.synchronizeState()
  	// Now catch up and start processing new events per normal
  	go engine.handleDockerEvents(derivedCtx)
  	engine.initialized = true
  	return nil
  }
docs: // Init initializes a DockerTaskEngine such that it may communicate with docker
  // and operate normally.
  // This function must be called before any other function, except serializing and deserializing, can succeed without error.