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. tensorflow--交叉熵

    学而不思则罔,思而不学则怠. 最近在看<TensorFlow 实战Google深度学习框架第二版>这本书.从头开始学习深度学习,对于细节方面进行探究.相当于重新拾起来这门”手艺“. 这篇随 ...

  2. Flask路由&视图

    1 路由  1.1app.url_map 查看所有路由 from flask import Flask app = Flask(__name__) @app.route('/') def hello_ ...

  3. java项目----衣服购买

    执行bat文件:注意t_temp.properties保存的文件是否为utf8编码native2ascii -encoding UTF-8 t_temp.properties r.properties ...

  4. PADS Layout VX.2.3 设置测量精度

    操作系统:Windows 10 x64 工具1:PADS Layout VX.2.3 Pin #7.#8的实际距离是0.65mm,但是测量的结果却是0.7mm.为什么呢?这是由于测量精度的设置不恰当造 ...

  5. 单机MongoD搭建

    MongoD 安装 1 .下载地址: wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.6.8.tgz 2 .添加 ...

  6. skopeo---github简单记录

    新的redhat 8已默认不集成docker,而是使用podman了. podman和skopeo和buildah,cri-o一起,组成了新一代的容器四大天王. 花时时间了解下,是值得的. skope ...

  7. PHP实现多维数组按指定值排序

    主要用到的PHP函数 array_multisort() .先实现指定多维数组一个字段排序 根据二维数组的id值来排序,转换后的数组格式如下: function arraySortByOneField ...

  8. mysql使用错误

    mysql运行报The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time z ...

  9. vuex脑图

  10. php unicode编码和字符串互转

    php字符串转Unicode编码, Unicode编码转php字符 百度了很多,都一样, 要么不对, 要不就是只是把字符串的汉字转Unicode 经过多次试验查找, 找到了如下方法, 注意:字符串编码 ...