Used new CommandInfo with Docker::run.

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


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

Branch: refs/heads/master
Commit: 5165a4a54ae5f45d79af40336c056ab0dcbdd8ec
Parents: 2057e3f
Author: Benjamin Hindman <[email protected]>
Authored: Thu Aug 14 10:14:04 2014 -0700
Committer: Benjamin Hindman <[email protected]>
Committed: Thu Aug 14 10:14:04 2014 -0700

----------------------------------------------------------------------
 src/docker/docker.cpp | 64 +++++++++++++++++++++++++++++++---------------
 1 file changed, 44 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/5165a4a5/src/docker/docker.cpp
----------------------------------------------------------------------
diff --git a/src/docker/docker.cpp b/src/docker/docker.cpp
index 71dbb13..b6b8aab 100644
--- a/src/docker/docker.cpp
+++ b/src/docker/docker.cpp
@@ -51,7 +51,7 @@ using std::string;
 using std::vector;
 
 
-template<class T>
+template <typename T>
 static Future<T> failure(
     const string& cmd,
     int status,
@@ -225,7 +225,10 @@ Future<Nothing> Docker::run(
 
   const ContainerInfo::DockerInfo& dockerInfo = containerInfo.docker();
 
-  string cmd = path + " run -d";
+  vector<string> argv;
+  argv.push_back(path);
+  argv.push_back("run");
+  argv.push_back("-d");
 
   if (resources.isSome()) {
     // TODO(yifan): Support other resources (e.g. disk, ports).
@@ -233,36 +236,33 @@ Future<Nothing> Docker::run(
     if (cpus.isSome()) {
       uint64_t cpuShare =
         std::max((uint64_t) (CPU_SHARES_PER_CPU * cpus.get()), MIN_CPU_SHARES);
-      cmd += " -c " + stringify(cpuShare);
+      argv.push_back("-c");
+      argv.push_back(stringify(cpuShare));
     }
 
     Option<Bytes> mem = resources.get().mem();
     if (mem.isSome()) {
       Bytes memLimit = std::max(mem.get(), MIN_MEMORY);
-      cmd += " -m " + stringify(memLimit.bytes());
+      argv.push_back("-m");
+      argv.push_back(stringify(memLimit.bytes()));
     }
   }
 
   if (env.isSome()) {
-    // TODO(tnachen): Use subprocess with args instead once we can
-    // handle splitting command string into args.
     foreachpair (string key, string value, env.get()) {
-      key = strings::replace(key, "\"", "\\\"");
-      value = strings::replace(value, "\"", "\\\"");
-      cmd += " -e \"" + key + "=" + value + "\"";
+      argv.push_back("-e");
+      argv.push_back(key + "=" + value);
     }
   }
 
   foreach (const Environment::Variable& variable,
            commandInfo.environment().variables()) {
-    // TODO(tnachen): Use subprocess with args instead once we can
-    // handle splitting command string into args.
-    string key = strings::replace(variable.name(), "\"", "\\\"");
-    string value = strings::replace(variable.value(), "\"", "\\\"");
-    cmd += " -e \"" + key + "=" + value + "\"";
+    argv.push_back("-e");
+    argv.push_back(variable.name() + "=" + variable.value());
   }
 
-  cmd += " -e \"MESOS_SANDBOX=" + mappedDirectory + "\"";
+  argv.push_back("-e");
+  argv.push_back("MESOS_SANDBOX=" + mappedDirectory);
 
   foreach (const Volume& volume, containerInfo.volumes()) {
     string volumeConfig = volume.container_path();
@@ -279,11 +279,13 @@ Future<Nothing> Docker::run(
       return Failure("Host path is required with mode");
     }
 
-    cmd += " -v=" + volumeConfig;
+    argv.push_back("-v");
+    argv.push_back(volumeConfig);
   }
 
   // Mapping sandbox directory into the contianer mapped directory.
-  cmd += " -v=" + sandboxDirectory + ":" + mappedDirectory;
+  argv.push_back("-v");
+  argv.push_back(sandboxDirectory + ":" + mappedDirectory);
 
   const string& image = dockerInfo.image();
 
@@ -293,8 +295,28 @@ Future<Nothing> Docker::run(
   // expected to be an executor it needs to be able to communicate
   // with the slave by the slave's PID. There can be more future work
   // to allow a bridge to connect but this is not yet implemented.
-  cmd += " --net=host --name=" + name + " " + image + " " +
-         commandInfo.value();
+  argv.push_back("--net");
+  argv.push_back("host");
+
+  argv.push_back("--name");
+  argv.push_back(name);
+  argv.push_back(image);
+
+  if (commandInfo.shell()) {
+    argv.push_back("/bin/sh");
+    argv.push_back("-c");
+    argv.push_back(commandInfo.value());
+  } else {
+    if (commandInfo.has_value()) {
+      argv.push_back(commandInfo.value());
+    }
+
+    foreach (const string& argument, commandInfo.arguments()) {
+      argv.push_back(argument);
+    }
+  }
+
+  string cmd = strings::join(" ", argv);
 
   VLOG(1) << "Running " << cmd;
 
@@ -308,10 +330,12 @@ Future<Nothing> Docker::run(
   environment["HOME"] = sandboxDirectory;
 
   Try<Subprocess> s = subprocess(
-      cmd,
+      path,
+      argv,
       Subprocess::PATH("/dev/null"),
       Subprocess::PIPE(),
       Subprocess::PIPE(),
+      None(),
       environment);
 
   if (s.isError()) {

Reply via email to