code: def docker_call(tool, tool_parameters, work_dir, java_opts=None, outfile=None,
                  dockerhub='aarjunrao', interactive=False):
      if outfile:
          assert isinstance(outfile, file), 'outfile was not passsed a file'
          assert outfile.mode in ['w', 'a', 'wb', 'ab'], 'outfile not writeable'
          assert not outfile.closed, 'outfile is closed'
      if interactive:
          interactive = '-i'
      else:
          interactive = ''
      if ':' in tool:
          docker_tool = '/'.join([dockerhub, tool])
      else:
          docker_tool = ''.join([dockerhub, '/', tool, ':latest'])
      call = ['docker', 'images']
      dimg_rv = subprocess.check_output(call)
      existing_images = [':'.join(x.split()[0:2]) for x in dimg_rv.splitlines()
                         if x.startswith(dockerhub)]
      if docker_tool not in existing_images:
          try:
              call = ' '.join(['docker', 'pull', docker_tool]).split()
              subprocess.check_call(call)
          except subprocess.CalledProcessError as err:
              raise RuntimeError('docker command returned a non-zero exit status ' +
                                 '(%s)' % err.returncode + 'for command \"%s\"' % ' '.join(call),)
          except OSError:
              raise RuntimeError('docker not found on system. Install on all' +
                                 ' nodes.')
      if java_opts:
          base_docker_call = ' docker run -e JAVA_OPTS=-Xmx{} '.format(java_opts) + '--rm=true ' + \
              '-v {}:/data --log-driver=none '.format(work_dir) + interactive
      else:
          base_docker_call = ' docker run --rm=true -v {}:/data '.format(work_dir) + \
              '--log-driver=none ' + interactive
      call = base_docker_call.split() + [docker_tool] + tool_parameters
      try:
          subprocess.check_call(call, stdout=outfile)
      except subprocess.CalledProcessError as err:
          raise RuntimeError('docker command returned a non-zero exit status (%s)' % err.returncode +
                             'for command \"%s\"' % ' '.join(call),)
      except OSError:
          raise RuntimeError('docker not found on system. Install on all nodes.')