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;
};