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 <[email protected]> Authored: Mon Jun 23 09:33:25 2014 -0700 Committer: Benjamin Hindman <[email protected]> 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(); }
