class_docstr: EnvironmentController inherits from BaseController and manages business logic related to the
  environment.
  
  Methods
  -------
  create(dictionary)
      Create an environment within the project
  build(id)
      Build the environment for use within the project
  list()
      List all environments within the project
  delete(id)
      Delete the specified environment from the project
class_docstr_tok: ["EnvironmentController","inherits","from","BaseController","and","manages","business","logic","related","to","the","environment",".","Methods","--","--","--","-","create","(","dictionary",")","Create","an","environment","within","the","project","build","(","id",")","Build","the","environment","for","use","within","the","project","list","(",")","List","all","environments","within","the","project","delete","(","id",")","Delete","the","specified","environment","from","the","project"]
docstr: Run and log an instance of the environment with the options given
  
  Parameters
  ----------
  environment_id : str
  options : dict
      can include the following values:
  
      command : list, optional
      ports : list, optional
          Here are some example ports used for common applications.
             *  'jupyter notebook' - 8888
             *  flask API - 5000
             *  tensorboard - 6006
          An example input for the above would be ["8888:8888", "5000:5000", "6006:6006"]
          which maps the running host port (right) to that of the environment (left)
      name : str, optional
      volumes : dict, optional
      mem_limit : str, optional
      gpu : bool, default False
      detach : bool, optional
      stdin_open : bool, optional
      tty : bool, optional
  log_filepath : str
      filepath to the log file
  
  Returns
  -------
  return_code : int
      system return code for container and logs
  run_id : str
      identification for run of the environment
  logs : str
      string version of output logs for the container
docstr_tok: ["Run","and","log","an","instance","of","the","environment","with","the","options","given","Parameters","--","--","--","--","--","environment_id",":","str","options",":","dict","can","include","the","following","values",":","command",":","list",",","optional","ports",":","list",",","optional","Here","are","some","example","ports","used","for","common","applications",".","*","'jupyter","notebook","'","-","8888","*","flask","API","-","5000","*","tensorboard","-","6006","An","example","input","for","the","above","would","be","[","``","8888:8888","''",",","``","5000:5000","''",",","``","6006:6006","''","]","which","maps","the","running","host","port","(","right",")","to","that","of","the","environment","(","left",")","name",":","str",",","optional","volumes",":","dict",",","optional","mem_limit",":","str",",","optional","gpu",":","bool",",","default","False","detach",":","bool",",","optional","stdin_open",":","bool",",","optional","tty",":","bool",",","optional","log_filepath",":","str","filepath","to","the","log","file","Returns","--","--","--","-","return_code",":","int","system","return","code","for","container","and","logs","run_id",":","str","identification","for","run","of","the","environment","logs",":","str","string","version","of","output","logs","for","the","container"]
code: def run(self, environment_id, options, log_filepath):
      """Run and log an instance of the environment with the options given
  
      Parameters
      ----------
      environment_id : str
      options : dict
          can include the following values:
  
          command : list, optional
          ports : list, optional
              Here are some example ports used for common applications.
                 *  'jupyter notebook' - 8888
                 *  flask API - 5000
                 *  tensorboard - 6006
              An example input for the above would be ["8888:8888", "5000:5000", "6006:6006"]
              which maps the running host port (right) to that of the environment (left)
          name : str, optional
          volumes : dict, optional
          mem_limit : str, optional
          gpu : bool, default False
          detach : bool, optional
          stdin_open : bool, optional
          tty : bool, optional
      log_filepath : str
          filepath to the log file
  
      Returns
      -------
      return_code : int
          system return code for container and logs
      run_id : str
          identification for run of the environment
      logs : str
          string version of output logs for the container
      """
      self.environment_driver.init()
      # TODO: Check hardware info here if different from creation time
      final_return_code, run_id, logs = self.environment_driver.run(
          environment_id, options, log_filepath
      )
      return final_return_code, run_id, logs
  
imports: import os
  import shutil
  from datmo.core.controller.base import BaseController
  from datmo.core.controller.file.file_collection import FileCollectionController
  from datmo.core.entity.environment import Environment
  from datmo.core.util.i18n import get
  from datmo.core.util.validation import validate
  from datmo.core.util.spinner import Spinner
  from datmo.core.util.json_store import JSONStore
  from datmo.core.util.misc_functions import get_datmo_temp_path, list_all_filepaths
  from datmo.core.util.exceptions import PathDoesNotExist, RequiredArgumentMissing, TooManyArgumentsFound, EnvironmentNotInitialized, UnstagedChanges, ArgumentError, EnvironmentDoesNotExist, ProjectNotInitialized
label_desc: Use image node_id 10 for calling the EnvironmentController obj's underlying member method code with example usage: obj.run(environment_id, options, log_filepath) and returns: final_return_code,  run_id,  logs