You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by ji...@apache.org on 2016/02/04 03:44:43 UTC

mesos git commit: Supported env var in docker runtime isolator.

Repository: mesos
Updated Branches:
  refs/heads/master 60ff5cf0b -> 40445848a


Supported env var in docker runtime isolator.

Review: https://reviews.apache.org/r/43037/


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

Branch: refs/heads/master
Commit: 40445848ac70642959ee2052991f8ed0c56cbff6
Parents: 60ff5cf
Author: Gilbert Song <so...@gmail.com>
Authored: Wed Feb 3 17:58:08 2016 -0800
Committer: Jie Yu <yu...@gmail.com>
Committed: Wed Feb 3 18:44:33 2016 -0800

----------------------------------------------------------------------
 src/slave/containerizer/mesos/containerizer.cpp | 36 ++++++++++----
 .../mesos/isolators/docker/runtime.cpp          | 50 ++++++++++++++++++++
 .../mesos/isolators/docker/runtime.hpp          |  7 ++-
 3 files changed, 82 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/40445848/src/slave/containerizer/mesos/containerizer.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/containerizer.cpp b/src/slave/containerizer/mesos/containerizer.cpp
index 12294cd..ed8a545 100644
--- a/src/slave/containerizer/mesos/containerizer.cpp
+++ b/src/slave/containerizer/mesos/containerizer.cpp
@@ -912,6 +912,15 @@ Future<bool> MesosContainerizerProcess::__launch(
     return Failure("Container is currently being destroyed");
   }
 
+  // Prepare environment variables for the executor.
+  map<string, string> environment = executorEnvironment(
+      executorInfo,
+      directory,
+      slaveId,
+      slavePid,
+      checkpoint,
+      flags);
+
   // Determine the root filesystem for the container. Only one
   // isolator should return the container root filesystem.
   Option<string> rootfs;
@@ -923,16 +932,25 @@ Future<bool> MesosContainerizerProcess::__launch(
         rootfs = launchInfo->rootfs();
       }
     }
-  }
 
-  // Prepare environment variables for the executor.
-  map<string, string> environment = executorEnvironment(
-      executorInfo,
-      directory,
-      slaveId,
-      slavePid,
-      checkpoint,
-      flags);
+    if (launchInfo.isSome() && launchInfo->has_environment()) {
+      foreach (const Environment::Variable& variable,
+               launchInfo->environment().variables()) {
+        const string& name = variable.name();
+        const string& value = variable.value();
+
+        if (environment.count(name)) {
+          VLOG(1) << "Overwriting environment variable '"
+                  << name << "', original: '"
+                  << environment[name] << "', new: '"
+                  << value << "', for container "
+                  << containerId;
+        }
+
+        environment[name] = value;
+      }
+    }
+  }
 
   // TODO(jieyu): Consider moving this to 'executorEnvironment' and
   // consolidating with docker containerizer.

http://git-wip-us.apache.org/repos/asf/mesos/blob/40445848/src/slave/containerizer/mesos/isolators/docker/runtime.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/isolators/docker/runtime.cpp b/src/slave/containerizer/mesos/isolators/docker/runtime.cpp
index 5189a6d..399ba89 100644
--- a/src/slave/containerizer/mesos/isolators/docker/runtime.cpp
+++ b/src/slave/containerizer/mesos/isolators/docker/runtime.cpp
@@ -15,9 +15,11 @@
 // limitations under the License.
 
 #include <list>
+#include <string>
 
 #include <glog/logging.h>
 
+#include <stout/foreach.hpp>
 #include <stout/stringify.hpp>
 
 #include "slave/flags.hpp"
@@ -90,10 +92,58 @@ Future<Option<ContainerLaunchInfo>> DockerRuntimeIsolatorProcess::prepare(
   // command, and working directory.
   ContainerLaunchInfo launchInfo;
 
+  Option<Environment> environment = getLaunchEnvironment(
+      containerId,
+      containerConfig);
+
+  if (environment.isSome()) {
+    launchInfo.mutable_environment()->CopyFrom(environment.get());
+  }
+
   return launchInfo;
 }
 
 
+Option<Environment> DockerRuntimeIsolatorProcess::getLaunchEnvironment(
+    const ContainerID& containerId,
+    const ContainerConfig& containerConfig)
+{
+  CHECK(containerConfig.docker().manifest().has_config());
+
+  if (containerConfig.docker().manifest().config().env_size() == 0) {
+    return None();
+  }
+
+  Environment environment;
+
+  foreach(const string& env,
+          containerConfig.docker().manifest().config().env()) {
+    // Use `find_first_of` to prevent to case that there are
+    // multiple '=' existing.
+    size_t position = env.find_first_of('=');
+    if (position == string::npos) {
+      VLOG(1) << "Skipping invalid environment variable: '"
+              << env << "' in docker manifest for container "
+              << containerId;
+
+      continue;
+    }
+
+    const string name = env.substr(0, position);
+    const string value = env.substr(position + 1);
+
+    // Keep all environment from runtime isolator. If there exists
+    // environment variable duplicate cases, it will be overwritten
+    // in mesos containerizer.
+    Environment::Variable* variable = environment.add_variables();
+    variable->set_name(name);
+    variable->set_value(value);
+  }
+
+  return environment;
+}
+
+
 Future<Nothing> DockerRuntimeIsolatorProcess::isolate(
     const ContainerID& containerId,
     pid_t pid)

http://git-wip-us.apache.org/repos/asf/mesos/blob/40445848/src/slave/containerizer/mesos/isolators/docker/runtime.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/isolators/docker/runtime.hpp b/src/slave/containerizer/mesos/isolators/docker/runtime.hpp
index a0e82a3..e419b6b 100644
--- a/src/slave/containerizer/mesos/isolators/docker/runtime.hpp
+++ b/src/slave/containerizer/mesos/isolators/docker/runtime.hpp
@@ -59,8 +59,11 @@ public:
       const ContainerID& containerId);
 
 private:
-  DockerRuntimeIsolatorProcess(
-      const Flags& flags);
+  DockerRuntimeIsolatorProcess(const Flags& flags);
+
+  Option<Environment> getLaunchEnvironment(
+      const ContainerID& containerId,
+      const mesos::slave::ContainerConfig& containerConfig);
 
   const Flags flags;
 };