mesos-docker-executor的运行代码在src/docker/executor.cpp中

 

  1. int main(int argc, char** argv)
  2. {
  3.   GOOGLE_PROTOBUF_VERIFY_VERSION;
  4.  
  5.   mesos::internal::docker::Flags flags;
  6.  
  7.   // Load flags from environment and command line.
  8.   Try<Nothing> load = flags.load(None(), &argc, &argv);
  9.  
  10.   if (load.isError()) {
  11.     cerr << flags.usage(load.error()) << endl;
  12.     return EXIT_FAILURE;
  13.   }
  14.  
  15.   std::cout << stringify(flags) << std::endl;
  16.  
  17.   mesos::internal::logging::initialize(argv[0], flags, true); // Catch signals.
  18.  
  19.   if (flags.help) {
  20.     cout << flags.usage() << endl;
  21.     return EXIT_SUCCESS;
  22.   }
  23.  
  24.   std::cout << stringify(flags) << std::endl;
  25.  
  26.   if (flags.docker.isNone()) {
  27.     cerr << flags.usage("Missing required option --docker") << endl;
  28.     return EXIT_FAILURE;
  29.   }
  30.  
  31.   if (flags.container.isNone()) {
  32.     cerr << flags.usage("Missing required option --container") << endl;
  33.     return EXIT_FAILURE;
  34.   }
  35.  
  36.   if (flags.sandbox_directory.isNone()) {
  37.     cerr << flags.usage("Missing required option --sandbox_directory") << endl;
  38.     return EXIT_FAILURE;
  39.   }
  40.  
  41.   if (flags.mapped_directory.isNone()) {
  42.     cerr << flags.usage("Missing required option --mapped_directory") << endl;
  43.     return EXIT_FAILURE;
  44.   }
  45.  
  46.   if (flags.stop_timeout.isNone()) {
  47.     cerr << flags.usage("Missing required option --stop_timeout") << endl;
  48.     return EXIT_FAILURE;
  49.   }
  50.  
  51.   if (flags.launcher_dir.isNone()) {
  52.     cerr << flags.usage("Missing required option --launcher_dir") << endl;
  53.     return EXIT_FAILURE;
  54.   }
  55.  
  56.   // The 2nd argument for docker create is set to false so we skip
  57.   // validation when creating a docker abstraction, as the slave
  58.   // should have already validated docker.
  59.   Try<Owned<Docker>> docker = Docker::create(
  60.       flags.docker.get(),
  61.       flags.docker_socket.get(),
  62.       false);
  63.  
  64.   if (docker.isError()) {
  65.     cerr << "Unable to create docker abstraction: " << docker.error() << endl;
  66.     return EXIT_FAILURE;
  67.   }
  68.  
  69.   mesos::internal::docker::DockerExecutor executor(
  70.       docker.get(),
  71.       flags.container.get(),
  72.       flags.sandbox_directory.get(),
  73.       flags.mapped_directory.get(),
  74.       flags.stop_timeout.get(),
  75.       flags.launcher_dir.get());
  76.  
  77.   mesos::MesosExecutorDriver driver(&executor);
  78.   return driver.run() == mesos::DRIVER_STOPPED ? EXIT_SUCCESS : EXIT_FAILURE;
  79. }

 

如上一篇文章对MesosExecutorDriver的分析,Mesos-slave给Executor发送message运行Task,会调用DockerExecutor的launchTask函数。

  1. virtual
    void launchTask(ExecutorDriver* driver, const TaskInfo& task)
  2. {
  3.   dispatch(process.get(), &DockerExecutorProcess::launchTask, driver, task);
  4. }

 

最后调用DockerExecutorProcess的launchTask函数。

  1. void launchTask(ExecutorDriver* driver, const TaskInfo& task)
  2. {
  3.   if (run.isSome()) {
  4.     TaskStatus status;
  5.     status.mutable_task_id()->CopyFrom(task.task_id());
  6.     status.set_state(TASK_FAILED);
  7.     status.set_message(
  8.         "Attempted to run multiple tasks using a \"docker\" executor");
  9.  
  10.     driver->sendStatusUpdate(status);
  11.     return;
  12.   }
  13.  
  14.   // Capture the TaskID.
  15.   taskId = task.task_id();
  16.  
  17.   cout << "Starting task " << taskId.get() << endl;
  18.  
  19.   CHECK(task.has_container());
  20.   CHECK(task.has_command());
  21.  
  22.   CHECK(task.container().type() == ContainerInfo::DOCKER);
  23.  
  24.   // We're adding task and executor resources to launch docker since
  25.   // the DockerContainerizer updates the container cgroup limits
  26.   // directly and it expects it to be the sum of both task and
  27.   // executor resources. This does leave to a bit of unaccounted
  28.   // resources for running this executor, but we are assuming
  29.   // this is just a very small amount of overcommit.
  30.   run = docker->run(
  31.       task.container(),
  32.       task.command(),
  33.       containerName,
  34.       sandboxDirectory,
  35.       mappedDirectory,
  36.       task.resources() + task.executor().resources(),
  37.       None(),
  38.       Subprocess::FD(STDOUT_FILENO),
  39.       Subprocess::FD(STDERR_FILENO));
  40.  
  41.   run->onAny(defer(self(), &Self::reaped, driver, lambda::_1));
  42.  
  43.   // Delay sending TASK_RUNNING status update until we receive
  44.   // inspect output.
  45.   inspect = docker->inspect(containerName, DOCKER_INSPECT_DELAY)
  46.     .then(defer(self(), [=](const Docker::Container& container) {
  47.       if (!killed) {
  48.         TaskStatus status;
  49.         status.mutable_task_id()->CopyFrom(taskId.get());
  50.         status.set_state(TASK_RUNNING);
  51.         status.set_data(container.output);
  52.         if (container.ipAddress.isSome()) {
  53.           // TODO(karya): Deprecated -- Remove after 0.25.0 has shipped.
  54.           Label* label = status.mutable_labels()->add_labels();
  55.           label->set_key("Docker.NetworkSettings.IPAddress");
  56.           label->set_value(container.ipAddress.get());
  57.  
  58.           NetworkInfo* networkInfo =
  59.             status.mutable_container_status()->add_network_infos();
  60.  
  61.           // TODO(CD): Deprecated -- Remove after 0.27.0.
  62.           networkInfo->set_ip_address(container.ipAddress.get());
  63.  
  64.           NetworkInfo::IPAddress* ipAddress =
  65.             networkInfo->add_ip_addresses();
  66.           ipAddress->set_ip_address(container.ipAddress.get());
  67.         }
  68.         driver->sendStatusUpdate(status);
  69.       }
  70.  
  71.       return Nothing();
  72.     }));
  73.  
  74.   inspect.onReady(
  75.       defer(self(), &Self::launchHealthCheck, containerName, task));
  76. }

 

调用Docker函数启容器。

Mesos源码分析(16): mesos-docker-executor的运行的更多相关文章

  1. Mesos源码分析(10): MesosSchedulerDriver的启动及运行一个Task

      MesosSchedulerDriver的代码在src/sched/sched.cpp里面实现.     Driver->run()调用start()     首先检测Mesos-Maste ...

  2. Mesos源码分析(5): Mesos Master的启动之四

      5. Create an instance of allocator.   代码如下   Mesos源码中默认的Allocator,即HierarchicalDRFAllocator的位置在$ME ...

  3. Mesos源码分析(4) Mesos Master的启动之三

    3. ModuleManager::load(flags.modules.get())如果有参数--modules或者--modules_dir=dirpath,则会将路径中的so文件load进来   ...

  4. Mesos源码分析(2): Mesos Master的启动之一

    Mesos Master的启动参数如下: /usr/sbin/mesos-master --zk=zk://127.0.0.1:2181/mesos --port=5050 --log_dir=/va ...

  5. Mesos源码分析(6): Mesos Master的初始化

      Mesos Master的初始化在src/master/master.cpp中     在Mesos Master的log中,是能看到这一行的.   1.初始化role,并设置weight权重   ...

  6. Mesos源码分析(3): Mesos Master的启动之二

    2. process::firewall::install(move(rules));如果有参数--firewall_rules则会添加规则   对应的代码如下: // Initialize fire ...

  7. Mesos源码分析(1): Mesos的启动过程总论

  8. Mesos源码分析

    Mesos源码分析(1): Mesos的启动过程总论 Mesos源码分析(2): Mesos Master的启动之一 Mesos源码分析(3): Mesos Master的启动之二 Mesos源码分析 ...

  9. Mesos源码分析(11): Mesos-Master接收到launchTasks消息

    根据Mesos源码分析(6): Mesos Master的初始化中的代码分析,当Mesos-Master接收到launchTask消息的时候,会调用Master::launchTasks函数.   v ...

随机推荐

  1. 清晰讲解SQL语句中的内连接,通用于Mysql和Oracle,全是干货哦

    本文章目的:力求清晰明了讲解SQL语句的内连接的各种应用,没有深奥的理解! 前奏:这篇文章和下篇文章会将内连接和外连接讲解清楚SQL语句的多表查询常用的有以下几种:两表联合查询(1)内连接(2)外连接 ...

  2. The import javax.servlet.jsp.JspException cannot be resolved

    问题描述   重新更换了 Apache Tomcat 的版本,在 Eclipse 中项目报错信息:The import javax.servlet.jsp.JspException cannot be ...

  3. Python3学习笔记十三

    1.   css 老师的博客:http://www.cnblogs.com/yuanchenqi/articles/6856399.html 选择器:找到想要改变的标签 css的功能:渲染和布局 2. ...

  4. jQuery概念

  5. Lua脚本在redis分布式锁场景的运用

    目录 锁和分布式锁 锁是什么? 为什么需要锁? Java中的锁 分布式锁 redis 如何实现加锁 锁超时 retry redis 如何释放锁 不该释放的锁 通过Lua脚本实现锁释放 用redis做分 ...

  6. WPF自定义轮播控件

     闲得蛋疼做了一个WPF制作轮播动画(随机动画),勉强可以看,写个随笔留个脚印.  效果图:

  7. 【Idea】好的插件集合,持续更新

    UploadJar,用于配合Nexus上传jar包,方便上传 Key Promoter X,用于显示快捷键,学习快捷键非常实用 lombok,getter/setter使用注解,而不需要写 自动生成g ...

  8. 为什么要使用getters和setters/访问器?

    Why use getters and setters/accessors? 实际上会有很多人问这个问题....尤其是它成为Coding Style中一部分的时候. 文章出自LBushkin的回答 T ...

  9. 在Net MVC中应用JsTree

    先实现个基本用法 1 - 引入js和css 2 -  html <div id="list_left" class="col-md-2 pre-scrollable ...

  10. resource links

    http://cenalulu.github.io/linux/all-about-cpu-cache/