You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by be...@apache.org on 2014/08/05 00:09:24 UTC

[03/43] git commit: Integrated DockerContainerizer.

Integrated DockerContainerizer.


Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/1ecab99a
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/1ecab99a
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/1ecab99a

Branch: refs/heads/master
Commit: 1ecab99a039253d474702470397ed15e075a0b3a
Parents: fa400fe
Author: Benjamin Hindman <be...@gmail.com>
Authored: Mon Jun 23 09:33:25 2014 -0700
Committer: Benjamin Hindman <be...@gmail.com>
Committed: Mon Aug 4 15:08:15 2014 -0700

----------------------------------------------------------------------
 src/slave/containerizer/containerizer.cpp | 11 +++++++
 src/slave/containerizer/docker.cpp        | 42 +++++++++++++++++++-------
 2 files changed, 42 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/1ecab99a/src/slave/containerizer/containerizer.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/containerizer.cpp b/src/slave/containerizer/containerizer.cpp
index d62d25d..0978dc2 100644
--- a/src/slave/containerizer/containerizer.cpp
+++ b/src/slave/containerizer/containerizer.cpp
@@ -36,6 +36,7 @@
 #endif // __linux__
 #include "slave/containerizer/composing.hpp"
 #include "slave/containerizer/containerizer.hpp"
+#include "slave/containerizer/docker.hpp"
 #include "slave/containerizer/isolator.hpp"
 #include "slave/containerizer/launcher.hpp"
 #include "slave/containerizer/external_containerizer.hpp"
@@ -170,6 +171,16 @@ Try<Containerizer*> Containerizer::create(const Flags& flags, bool local)
       } else {
         containerizers.push_back(containerizer.get());
       }
+    }  else if (type == "docker") {
+      Docker docker("docker");
+      Try<DockerContainerizer*> containerizer =
+        DockerContainerizer::create(flags, local, docker);
+      if (containerizer.isError()) {
+        return Error("Could not create DockerContainerizer: " +
+                     containerizer.error());
+      } else {
+        containerizers.push_back(containerizer.get());
+      }
     } else if (type == "external") {
       Try<Containerizer*> containerizer =
         ExternalContainerizer::create(flags, local);

http://git-wip-us.apache.org/repos/asf/mesos/blob/1ecab99a/src/slave/containerizer/docker.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/docker.cpp b/src/slave/containerizer/docker.cpp
index 42bbd4c..3d62390 100644
--- a/src/slave/containerizer/docker.cpp
+++ b/src/slave/containerizer/docker.cpp
@@ -403,6 +403,9 @@ Future<Nothing> DockerContainerizerProcess::_recover(
     const list<Docker::Container>& containers)
 {
   foreach (const Docker::Container& container, containers) {
+    VLOG(1) << "Checking if Docker container named '"
+            << container.name() << "' was started by Mesos";
+
     Option<ContainerID> id = parse(container);
 
     // Ignore containers that Mesos didn't start.
@@ -410,12 +413,15 @@ Future<Nothing> DockerContainerizerProcess::_recover(
       continue;
     }
 
+    VLOG(1) << "Checking if Mesos container with ID '"
+            << stringify(id.get()) << "' has been orphaned";
+
     // Check if we're watching an executor for this container ID and
     // if not, kill the Docker container.
     if (!statuses.keys().contains(id.get())) {
       // TODO(benh): Retry 'docker kill' if it failed but the container
       // still exists (asynchronously).
-      docker.kill(container.name());
+      docker.kill(container.id());
     }
   }
 
@@ -478,10 +484,18 @@ Future<bool> DockerContainerizerProcess::launch(
             << "' (and executor '" << executorInfo.executor_id()
             << "') of framework '" << executorInfo.framework_id() << "'";
 
+  // Extract the Docker image.
+  string image = command.container().image();
+  image = strings::remove(image, "docker://", strings::PREFIX);
+
+  // Construct the Docker container name.
+  string name = DOCKER_NAME_PREFIX + stringify(containerId);
+
   // Start a docker container then launch the executor (but destroy
   // the Docker container if launching the executor failed).
-  return docker.run(command.container().image())
-    .then(defer(self(), &Self::_launch,
+  return docker.run(image, command.value(), name)
+    .then(defer(self(),
+                &Self::_launch,
                 containerId,
                 taskInfo,
                 executorInfo,
@@ -674,17 +688,23 @@ void DockerContainerizerProcess::reaped(const ContainerID& containerId)
 Option<ContainerID> DockerContainerizerProcess::parse(
     const Docker::Container& container)
 {
-  if (!strings::startsWith(container.name(), DOCKER_NAME_PREFIX)) {
-    return None();
+  Option<string> name = None();
+
+  if (strings::startsWith(container.name(), DOCKER_NAME_PREFIX)) {
+    name = strings::remove(
+        container.name(), DOCKER_NAME_PREFIX, strings::PREFIX);
+  } else if (strings::startsWith(container.name(), "/" + DOCKER_NAME_PREFIX)) {
+    name = strings::remove(
+        container.name(), "/" + DOCKER_NAME_PREFIX, strings::PREFIX);
   }
 
-  string name = strings::remove(
-      container.name(), DOCKER_NAME_PREFIX, strings::PREFIX);
-
-  ContainerID id;
-  id.set_value(name);
+  if (name.isSome()) {
+    ContainerID id;
+    id.set_value(name.get());
+    return id;
+  }
 
-  return id;
+  return None();
 }