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. 【算法】Normalization

    Normalization(归一化) 写这一篇的原因是以前只知道一个Batch Normalization,自以为懂了.结果最近看文章,又发现一个Layer Normalization,一下就懵逼了. ...

  2. Day04.a(对象类型的转换,多态)

    对象类型的转换 Dog dog = new Dog(); 通常情况下,对象(new Dog())类型和引用(dog)类型是相同的,当引用类型和对象类型不一致时,就需要类型转换. 向上转型:将较具体的类 ...

  3. iOS UIView Class Translation

    类 UIView 一个管理屏幕上矩形区域内容的对象.   概述 Views 是你应用的用户界面最基础的组成部分.UIView类定义了对于所有 views 的共有的行为.一个 view 对象在它的边界矩 ...

  4. 可持久化线段树——区间更新hdu4348

    和线段树类似,每个结点也要打lazy标记 但是lazy标记和线段树不一样 具体区别在于可持久化后lazy-tag不用往下传递,而是固定在这个区间并不断累加,变成了这个区间固有的性质(有点像分块的标记了 ...

  5. 关于8.0.15版本的mysql下载与安装

    下载MYSQL 官网下载MYSQL8.0.15版本,链接地址https://www.mysql.com/downloads/,流程如下 点击进入后,网页滑到最下面,根据自己电脑的型号下载相应的版本 安 ...

  6. [原创]Xilinx Vivado 2017.4/2018.3/2016.4/2015.4/ISE14.7下载及其安装

    最新版本Vivado 2018.3下载地址 链接:https://pan.baidu.com/s/17aE-vICRQYN27bD2sXCLxg提取码:ilg5 由于工程需要,下载VIVADO2018 ...

  7. SSH免密登录实现

    现在先想要把项目部署到linux系统中 通过使用maven添加tomcat插件可以做到,右击项目 配置这里的url,是部署到哪里的意思(比如我们现在将这个项目部署到以下系统的tomcat中) 此处只有 ...

  8. 浅谈Java语言中ArrayList和HashSet的区别

    Java语言中ArrayList和HashSet的区别 2019-04-10   13:22:49 一.基本区别 首先一起看个实例,其代码如下: package com.MrZ_baby.com; i ...

  9. Git帮助之初始化项目设置向导

    初始化项目设置向导 Git设置: git config --global user.name "Your Name Here" # 设置Git提交时的默认用户名,推荐使用本站用户名 ...

  10. hbase_1

    常见的RDBMS:(数据库排行) ** mysql --开源[社区版] .收费[企业版] --市场占有率高.web领域被广泛使用 ** 2008年被oracle收购 ** mysql主从架构[集群的一 ...