You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by tn...@apache.org on 2015/09/01 07:57:05 UTC

mesos git commit: Added support for custom docker host.

Repository: mesos
Updated Branches:
  refs/heads/master 7e8370cdc -> 9d8829182


Added support for custom docker host.

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


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

Branch: refs/heads/master
Commit: 9d8829182e2b40bafc9aaa58e96ff3ac637d0b2c
Parents: 7e8370c
Author: Vaibhav Khanduja <va...@yahoo.com>
Authored: Tue Sep 1 00:08:23 2015 +0000
Committer: Timothy Chen <tn...@apache.org>
Committed: Mon Aug 31 22:56:57 2015 -0700

----------------------------------------------------------------------
 src/docker/docker.cpp                           | 39 +++++---
 src/docker/docker.hpp                           | 15 +++-
 src/docker/executor.cpp                         |  4 +-
 src/docker/executor.hpp                         |  6 ++
 src/slave/containerizer/docker.cpp              |  3 +-
 .../docker_containerizer_tests.cpp              | 93 +++++++++++++++-----
 src/tests/containerizer/docker_tests.cpp        | 29 ++++--
 src/tests/environment.cpp                       |  2 +-
 src/tests/flags.hpp                             |  9 ++
 src/tests/hook_tests.cpp                        |  3 +-
 src/tests/mesos.hpp                             |  2 +-
 11 files changed, 156 insertions(+), 49 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/9d882918/src/docker/docker.cpp
----------------------------------------------------------------------
diff --git a/src/docker/docker.cpp b/src/docker/docker.cpp
index 12dc050..2e17ced 100755
--- a/src/docker/docker.cpp
+++ b/src/docker/docker.cpp
@@ -95,10 +95,16 @@ static Future<Nothing> checkError(const string& cmd, const Subprocess& s)
     .then(lambda::bind(_checkError, cmd, s));
 }
 
-
-Try<Docker*> Docker::create(const string& path, bool validate)
+Try<Docker*> Docker::create(
+    const string& path,
+    const string& socket,
+    bool validate)
 {
-  Docker* docker = new Docker(path);
+  if (!strings::startsWith(socket, "/")) {
+    return Error("Invalid Docker socket path: " + socket);
+  }
+
+  Docker* docker = new Docker(path, socket);
   if (!validate) {
     return docker;
   }
@@ -147,7 +153,7 @@ void commandDiscarded(const Subprocess& s, const string& cmd)
 
 Future<Version> Docker::version() const
 {
-  string cmd = path + " --version";
+  string cmd = path + " -H " + socket + " --version";
 
   Try<Subprocess> s = subprocess(
       cmd,
@@ -348,6 +354,8 @@ Future<Nothing> Docker::run(
 
   vector<string> argv;
   argv.push_back(path);
+  argv.push_back("-H");
+  argv.push_back(socket);
   argv.push_back("run");
 
   if (dockerInfo.privileged()) {
@@ -595,7 +603,7 @@ Future<Nothing> Docker::stop(
                    stringify(timeoutSecs));
   }
 
-  string cmd = path + " stop -t " + stringify(timeoutSecs) +
+  string cmd = path + " -H " + socket + " stop -t " + stringify(timeoutSecs) +
                " " + containerName;
 
   VLOG(1) << "Running " << cmd;
@@ -642,7 +650,9 @@ Future<Nothing> Docker::rm(
     const string& containerName,
     bool force) const
 {
-  const string cmd = path + (force ? " rm -f " : " rm ") + containerName;
+  const string cmd =
+    path + " -H " + socket +
+    (force ? " rm -f " : " rm ") + containerName;
 
   VLOG(1) << "Running " << cmd;
 
@@ -666,7 +676,7 @@ Future<Docker::Container> Docker::inspect(
 {
   Owned<Promise<Docker::Container>> promise(new Promise<Docker::Container>());
 
-  const string cmd =  path + " inspect " + containerName;
+  const string cmd =  path + " -H " + socket + " inspect " + containerName;
   _inspect(cmd, promise, retryInterval);
 
   return promise->future();
@@ -800,7 +810,7 @@ Future<list<Docker::Container>> Docker::ps(
     bool all,
     const Option<string>& prefix) const
 {
-  string cmd = path + (all ? " ps -a" : " ps");
+  string cmd = path + " -H " + socket + (all ? " ps -a" : " ps");
 
   VLOG(1) << "Running " << cmd;
 
@@ -959,10 +969,12 @@ Future<Docker::Image> Docker::pull(
 
   if (force) {
     // Skip inspect and docker pull the image.
-    return Docker::__pull(*this, directory, image, path);
+    return Docker::__pull(*this, directory, image, path, socket);
   }
 
   argv.push_back(path);
+  argv.push_back("-H");
+  argv.push_back(socket);
   argv.push_back("inspect");
   argv.push_back(dockerImage);
 
@@ -997,6 +1009,7 @@ Future<Docker::Image> Docker::pull(
         directory,
         dockerImage,
         path,
+        socket,
         output));
 }
 
@@ -1007,6 +1020,7 @@ Future<Docker::Image> Docker::_pull(
     const string& directory,
     const string& image,
     const string& path,
+    const string& socket,
     Future<string> output)
 {
   Option<int> status = s.status().get();
@@ -1017,7 +1031,7 @@ Future<Docker::Image> Docker::_pull(
 
   output.discard();
 
-  return Docker::__pull(docker, directory, image, path);
+  return Docker::__pull(docker, directory, image, path, socket);
 }
 
 
@@ -1025,10 +1039,13 @@ Future<Docker::Image> Docker::__pull(
     const Docker& docker,
     const string& directory,
     const string& image,
-    const string& path)
+    const string& path,
+    const string& socket)
 {
   vector<string> argv;
   argv.push_back(path);
+  argv.push_back("-H");
+  argv.push_back(socket);
   argv.push_back("pull");
   argv.push_back(image);
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/9d882918/src/docker/docker.hpp
----------------------------------------------------------------------
diff --git a/src/docker/docker.hpp b/src/docker/docker.hpp
index 6086710..4df57bc 100644
--- a/src/docker/docker.hpp
+++ b/src/docker/docker.hpp
@@ -42,7 +42,10 @@ class Docker
 {
 public:
   // Create Docker abstraction and optionally validate docker.
-  static Try<Docker*> create(const std::string& path, bool validate = true);
+  static Try<Docker*> create(
+    const std::string& path,
+    const std::string& socket,
+    bool validate = true);
 
   virtual ~Docker() {}
 
@@ -151,7 +154,9 @@ public:
 
 protected:
   // Uses the specified path to the Docker CLI tool.
-  Docker(const std::string& _path) : path(_path) {};
+  Docker(const std::string& _path,
+         const std::string& _socket)
+       : path(_path), socket("unix://" + _socket) {};
 
 private:
   static process::Future<Nothing> _run(
@@ -219,13 +224,15 @@ private:
       const std::string& directory,
       const std::string& image,
       const std::string& path,
+      const std::string& socket,
       process::Future<std::string> output);
 
   static process::Future<Image> __pull(
       const Docker& docker,
       const std::string& directory,
       const std::string& image,
-      const std::string& path);
+      const std::string& path,
+      const std::string& socket);
 
   static process::Future<Image> ___pull(
       const Docker& docker,
@@ -242,6 +249,8 @@ private:
       const std::string& cmd);
 
   const std::string path;
+  const std::string socket;
+
 };
 
 #endif // __DOCKER_HPP__

http://git-wip-us.apache.org/repos/asf/mesos/blob/9d882918/src/docker/executor.cpp
----------------------------------------------------------------------
diff --git a/src/docker/executor.cpp b/src/docker/executor.cpp
index 256d53d..6647075 100644
--- a/src/docker/executor.cpp
+++ b/src/docker/executor.cpp
@@ -406,7 +406,9 @@ int main(int argc, char** argv)
   // The 2nd argument for docker create is set to false so we skip
   // validation when creating a docker abstraction, as the slave
   // should have already validated docker.
-  Try<Docker*> docker = Docker::create(flags.docker.get(), false);
+  Try<Docker*> docker =
+    Docker::create(flags.docker.get(), flags.docker_socket.get(), false);
+
   if (docker.isError()) {
     cerr << "Unable to create docker abstraction: " << docker.error() << endl;
     return EXIT_FAILURE;

http://git-wip-us.apache.org/repos/asf/mesos/blob/9d882918/src/docker/executor.hpp
----------------------------------------------------------------------
diff --git a/src/docker/executor.hpp b/src/docker/executor.hpp
index fa13b6e..8ab4e98 100644
--- a/src/docker/executor.hpp
+++ b/src/docker/executor.hpp
@@ -40,6 +40,11 @@ struct Flags : public mesos::internal::logging::Flags
         "docker",
         "The path to the docker executable.\n");
 
+    add(&docker_socket,
+        "docker_socket",
+        "The UNIX socket path to be used by docker CLI for accessing docker\n"
+        "daemon.\n");
+
     add(&sandbox_directory,
         "sandbox_directory",
         "The path to the container sandbox holding stdout and stderr files\n"
@@ -57,6 +62,7 @@ struct Flags : public mesos::internal::logging::Flags
 
   Option<std::string> container;
   Option<std::string> docker;
+  Option<std::string> docker_socket;
   Option<std::string> sandbox_directory;
   Option<std::string> mapped_directory;
   Option<Duration> stop_timeout;

http://git-wip-us.apache.org/repos/asf/mesos/blob/9d882918/src/slave/containerizer/docker.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/docker.cpp b/src/slave/containerizer/docker.cpp
index a17e4f2..289d4ec 100644
--- a/src/slave/containerizer/docker.cpp
+++ b/src/slave/containerizer/docker.cpp
@@ -123,7 +123,7 @@ Try<DockerContainerizer*> DockerContainerizer::create(
     const Flags& flags,
     Fetcher* fetcher)
 {
-  Try<Docker*> create = Docker::create(flags.docker);
+  Try<Docker*> create = Docker::create(flags.docker, flags.docker_socket, true);
   if (create.isError()) {
     return Error("Failed to create docker: " + create.error());
   }
@@ -187,6 +187,7 @@ docker::Flags dockerFlags(
   dockerFlags.sandbox_directory = directory;
   dockerFlags.mapped_directory = flags.sandbox_directory;
   dockerFlags.stop_timeout = flags.docker_stop_timeout;
+  dockerFlags.docker_socket = flags.docker_socket;
   return dockerFlags;
 }
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/9d882918/src/tests/containerizer/docker_containerizer_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/containerizer/docker_containerizer_tests.cpp b/src/tests/containerizer/docker_containerizer_tests.cpp
index 936f8c7..2c43a3a 100644
--- a/src/tests/containerizer/docker_containerizer_tests.cpp
+++ b/src/tests/containerizer/docker_containerizer_tests.cpp
@@ -141,7 +141,10 @@ public:
 
   virtual void TearDown()
   {
-    Try<Docker*> docker = Docker::create(tests::flags.docker, false);
+    Try<Docker*> docker =
+      Docker::create(tests::flags.docker, tests::flags.docker_socket,
+      false);
+
     ASSERT_SOME(docker);
     Future<list<Docker::Container>> containers =
       docker.get()->ps(true, slave::DOCKER_NAME_PREFIX);
@@ -167,7 +170,9 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Launch_Executor)
   Try<PID<Master> > master = StartMaster();
   ASSERT_SOME(master);
 
-  MockDocker* mockDocker = new MockDocker(tests::flags.docker);
+  MockDocker* mockDocker =
+   new MockDocker(tests::flags.docker, tests::flags.docker_socket);
+
   Shared<Docker> docker(mockDocker);
 
   slave::Flags flags = CreateSlaveFlags();
@@ -277,7 +282,9 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Launch_Executor_Bridged)
   Try<PID<Master> > master = StartMaster();
   ASSERT_SOME(master);
 
-  MockDocker* mockDocker = new MockDocker(tests::flags.docker);
+  MockDocker* mockDocker =
+    new MockDocker(tests::flags.docker, tests::flags.docker_socket);
+
   Shared<Docker> docker(mockDocker);
 
   slave::Flags flags = CreateSlaveFlags();
@@ -384,7 +391,9 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Launch)
   Try<PID<Master> > master = StartMaster();
   ASSERT_SOME(master);
 
-  MockDocker* mockDocker = new MockDocker(tests::flags.docker);
+  MockDocker* mockDocker =
+    new MockDocker(tests::flags.docker, tests::flags.docker_socket);
+
   Shared<Docker> docker(mockDocker);
 
   slave::Flags flags = CreateSlaveFlags();
@@ -490,7 +499,9 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Kill)
   Try<PID<Master> > master = StartMaster();
   ASSERT_SOME(master);
 
-  MockDocker* mockDocker = new MockDocker(tests::flags.docker);
+  MockDocker* mockDocker =
+    new MockDocker(tests::flags.docker, tests::flags.docker_socket);
+
   Shared<Docker> docker(mockDocker);
 
   slave::Flags flags = CreateSlaveFlags();
@@ -598,7 +609,9 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Usage)
   slave::Flags flags = CreateSlaveFlags();
   flags.resources = Option<string>("cpus:2;mem:1024");
 
-  MockDocker* mockDocker = new MockDocker(tests::flags.docker);
+  MockDocker* mockDocker =
+    new MockDocker(tests::flags.docker, tests::flags.docker_socket);
+
   Shared<Docker> docker(mockDocker);
 
   Fetcher fetcher;
@@ -731,7 +744,9 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Update)
 
   slave::Flags flags = CreateSlaveFlags();
 
-  MockDocker* mockDocker = new MockDocker(tests::flags.docker);
+  MockDocker* mockDocker =
+    new MockDocker(tests::flags.docker, tests::flags.docker_socket);
+
   Shared<Docker> docker(mockDocker);
 
   Fetcher fetcher;
@@ -883,7 +898,9 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Recover)
 {
   slave::Flags flags = CreateSlaveFlags();
 
-  MockDocker* mockDocker = new MockDocker(tests::flags.docker);
+  MockDocker* mockDocker =
+    new MockDocker(tests::flags.docker, tests::flags.docker_socket);
+
   Shared<Docker> docker(mockDocker);
 
   Future<string> stoppedContainer;
@@ -998,7 +1015,9 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_SkipRecoverNonDocker)
 {
   slave::Flags flags = CreateSlaveFlags();
 
-  MockDocker* mockDocker = new MockDocker(tests::flags.docker);
+  MockDocker* mockDocker =
+    new MockDocker(tests::flags.docker, tests::flags.docker_socket);
+
   Shared<Docker> docker(mockDocker);
 
   Fetcher fetcher;
@@ -1051,7 +1070,9 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Logs)
 
   slave::Flags flags = CreateSlaveFlags();
 
-  MockDocker* mockDocker = new MockDocker(tests::flags.docker);
+  MockDocker* mockDocker =
+    new MockDocker(tests::flags.docker, tests::flags.docker_socket);
+
   Shared<Docker> docker(mockDocker);
 
   // We skip stopping the docker container because stopping a container
@@ -1169,7 +1190,9 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Default_CMD)
 
   slave::Flags flags = CreateSlaveFlags();
 
-  MockDocker* mockDocker = new MockDocker(tests::flags.docker);
+  MockDocker* mockDocker =
+    new MockDocker(tests::flags.docker, tests::flags.docker_socket);
+
   Shared<Docker> docker(mockDocker);
 
   // We skip stopping the docker container because stopping a container
@@ -1290,7 +1313,9 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Default_CMD_Override)
 
   slave::Flags flags = CreateSlaveFlags();
 
-  MockDocker* mockDocker = new MockDocker(tests::flags.docker);
+  MockDocker* mockDocker =
+    new MockDocker(tests::flags.docker, tests::flags.docker_socket);
+
   Shared<Docker> docker(mockDocker);
 
   // We skip stopping the docker container because stopping  a container
@@ -1414,7 +1439,9 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Default_CMD_Args)
 
   slave::Flags flags = CreateSlaveFlags();
 
-  MockDocker* mockDocker = new MockDocker(tests::flags.docker);
+  MockDocker* mockDocker =
+    new MockDocker(tests::flags.docker, tests::flags.docker_socket);
+
   Shared<Docker> docker(mockDocker);
 
   // We skip stopping the docker container because stopping a container
@@ -1540,7 +1567,9 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_SlaveRecoveryTaskContainer)
 
   slave::Flags flags = CreateSlaveFlags();
 
-  MockDocker* mockDocker = new MockDocker(tests::flags.docker);
+  MockDocker* mockDocker =
+    new MockDocker(tests::flags.docker, tests::flags.docker_socket);
+
   Shared<Docker> docker(mockDocker);
 
   Fetcher fetcher;
@@ -1689,7 +1718,9 @@ TEST_F(DockerContainerizerTest,
 
   slave::Flags flags = CreateSlaveFlags();
 
-  MockDocker* mockDocker = new MockDocker(tests::flags.docker);
+  MockDocker* mockDocker =
+    new MockDocker(tests::flags.docker, tests::flags.docker_socket);
+
   Shared<Docker> docker(mockDocker);
 
   Fetcher fetcher;
@@ -1847,7 +1878,9 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_NC_PortMapping)
 
   flags.resources = "cpus:1;mem:1024;ports:[10000-10000]";
 
-  MockDocker* mockDocker = new MockDocker(tests::flags.docker);
+  MockDocker* mockDocker =
+    new MockDocker(tests::flags.docker, tests::flags.docker_socket);
+
   Shared<Docker> docker(mockDocker);
 
   // We skip stopping the docker container because stopping a container
@@ -1988,7 +2021,9 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_LaunchSandboxWithColon)
 
   slave::Flags flags = CreateSlaveFlags();
 
-  MockDocker* mockDocker = new MockDocker(tests::flags.docker);
+  MockDocker* mockDocker =
+    new MockDocker(tests::flags.docker, tests::flags.docker_socket);
+
   Shared<Docker> docker(mockDocker);
 
   Fetcher fetcher;
@@ -2080,7 +2115,9 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_DestroyWhileFetching)
 
   slave::Flags flags = CreateSlaveFlags();
 
-  MockDocker* mockDocker = new MockDocker(tests::flags.docker);
+  MockDocker* mockDocker =
+    new MockDocker(tests::flags.docker, tests::flags.docker_socket);
+
   Shared<Docker> docker(mockDocker);
 
   Fetcher fetcher;
@@ -2185,7 +2222,9 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_DestroyWhilePulling)
 
   slave::Flags flags = CreateSlaveFlags();
 
-  MockDocker* mockDocker = new MockDocker(tests::flags.docker);
+  MockDocker* mockDocker =
+    new MockDocker(tests::flags.docker, tests::flags.docker_socket);
+
   Shared<Docker> docker(mockDocker);
 
   Fetcher fetcher;
@@ -2297,7 +2336,9 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_ExecutorCleanupWhenLaunchFailed)
 
   slave::Flags flags = CreateSlaveFlags();
 
-  MockDocker* mockDocker = new MockDocker(tests::flags.docker);
+  MockDocker* mockDocker =
+    new MockDocker(tests::flags.docker, tests::flags.docker_socket);
+
   Shared<Docker> docker(mockDocker);
 
   Fetcher fetcher;
@@ -2394,7 +2435,9 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_FetchFailure)
 
   slave::Flags flags = CreateSlaveFlags();
 
-  MockDocker* mockDocker = new MockDocker(tests::flags.docker);
+  MockDocker* mockDocker =
+    new MockDocker(tests::flags.docker, tests::flags.docker_socket);
+
   Shared<Docker> docker(mockDocker);
 
   Fetcher fetcher;
@@ -2495,7 +2538,9 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_DockerPullFailure)
 
   slave::Flags flags = CreateSlaveFlags();
 
-  MockDocker* mockDocker = new MockDocker(tests::flags.docker);
+  MockDocker* mockDocker =
+    new MockDocker(tests::flags.docker, tests::flags.docker_socket);
+
   Shared<Docker> docker(mockDocker);
 
   Fetcher fetcher;
@@ -2596,7 +2641,9 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_DockerInspectDiscard)
 
   slave::Flags flags = CreateSlaveFlags();
 
-  MockDocker* mockDocker = new MockDocker(tests::flags.docker);
+  MockDocker* mockDocker =
+    new MockDocker(tests::flags.docker, tests::flags.docker_socket);
+
   Shared<Docker> docker(mockDocker);
 
   Future<Docker::Container> inspect;

http://git-wip-us.apache.org/repos/asf/mesos/blob/9d882918/src/tests/containerizer/docker_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/containerizer/docker_tests.cpp b/src/tests/containerizer/docker_tests.cpp
index a4a2725..cfad368 100644
--- a/src/tests/containerizer/docker_tests.cpp
+++ b/src/tests/containerizer/docker_tests.cpp
@@ -52,7 +52,10 @@ class DockerTest : public MesosTest
 {
   virtual void TearDown()
   {
-    Try<Docker*> docker = Docker::create(tests::flags.docker, false);
+    Try<Docker*> docker =
+      Docker::create(tests::flags.docker, tests::flags.docker_socket,
+      false);
+
     ASSERT_SOME(docker);
 
     Future<list<Docker::Container>> containers =
@@ -75,7 +78,9 @@ TEST_F(DockerTest, ROOT_DOCKER_interface)
   const string containerName = NAME_PREFIX + "-test";
   Resources resources = Resources::parse("cpus:1;mem:512").get();
 
-  Owned<Docker> docker(Docker::create(tests::flags.docker, false).get());
+  Owned<Docker> docker(Docker::create(tests::flags.docker,
+                                      tests::flags.docker_socket,
+                                      false).get());
 
   // Verify that we do not see the container.
   Future<list<Docker::Container> > containers = docker->ps(true, containerName);
@@ -222,7 +227,9 @@ TEST_F(DockerTest, ROOT_DOCKER_interface)
 
 TEST_F(DockerTest, ROOT_DOCKER_CheckCommandWithShell)
 {
-  Owned<Docker> docker(Docker::create(tests::flags.docker, false).get());
+  Owned<Docker> docker(Docker::create(tests::flags.docker,
+                                     tests::flags.docker_socket,
+                                     false).get());
 
   ContainerInfo containerInfo;
   containerInfo.set_type(ContainerInfo::DOCKER);
@@ -248,7 +255,9 @@ TEST_F(DockerTest, ROOT_DOCKER_CheckCommandWithShell)
 TEST_F(DockerTest, ROOT_DOCKER_CheckPortResource)
 {
   const string containerName = NAME_PREFIX + "-port-resource-test";
-  Owned<Docker> docker(Docker::create(tests::flags.docker, false).get());
+  Owned<Docker> docker(Docker::create(tests::flags.docker,
+                                     tests::flags.docker_socket,
+                                     false).get());
 
   // Make sure the container is removed.
   Future<Nothing> remove = docker->rm(containerName, true);
@@ -318,7 +327,9 @@ TEST_F(DockerTest, ROOT_DOCKER_CancelPull)
 
   AWAIT_READY_FOR(s.get().status(), Seconds(30));
 
-  Owned<Docker> docker(Docker::create(tests::flags.docker, false).get());
+  Owned<Docker> docker(Docker::create(tests::flags.docker,
+                                      tests::flags.docker_socket,
+                                      false).get());
 
   Try<string> directory = environment->mkdtemp();
 
@@ -340,7 +351,9 @@ TEST_F(DockerTest, ROOT_DOCKER_CancelPull)
 // docker container works.
 TEST_F(DockerTest, ROOT_DOCKER_MountRelative)
 {
-  Owned<Docker> docker(Docker::create(tests::flags.docker, false).get());
+  Owned<Docker> docker(Docker::create(tests::flags.docker,
+                                     tests::flags.docker_socket,
+                                     false).get());
 
   ContainerInfo containerInfo;
   containerInfo.set_type(ContainerInfo::DOCKER);
@@ -380,7 +393,9 @@ TEST_F(DockerTest, ROOT_DOCKER_MountRelative)
 // docker container works.
 TEST_F(DockerTest, ROOT_DOCKER_MountAbsolute)
 {
-  Owned<Docker> docker(Docker::create(tests::flags.docker, false).get());
+  Owned<Docker> docker(Docker::create(tests::flags.docker,
+                                      tests::flags.docker_socket,
+                                      false).get());
 
   ContainerInfo containerInfo;
   containerInfo.set_type(ContainerInfo::DOCKER);

http://git-wip-us.apache.org/repos/asf/mesos/blob/9d882918/src/tests/environment.cpp
----------------------------------------------------------------------
diff --git a/src/tests/environment.cpp b/src/tests/environment.cpp
index d9dc266..e40cde2 100644
--- a/src/tests/environment.cpp
+++ b/src/tests/environment.cpp
@@ -174,7 +174,7 @@ public:
   DockerFilter()
   {
 #ifdef __linux__
-    Try<Docker*> docker = Docker::create(flags.docker);
+    Try<Docker*> docker = Docker::create(flags.docker, flags.docker_socket);
     if (docker.isError()) {
       dockerError = docker.error();
     } else {

http://git-wip-us.apache.org/repos/asf/mesos/blob/9d882918/src/tests/flags.hpp
----------------------------------------------------------------------
diff --git a/src/tests/flags.hpp b/src/tests/flags.hpp
index 3644956..06da36d 100644
--- a/src/tests/flags.hpp
+++ b/src/tests/flags.hpp
@@ -77,6 +77,14 @@ public:
         "Where to find docker executable",
         "docker");
 
+    add(&Flags::docker_socket,
+        "docker_socket",
+        "The UNIX socket path to be mounted into the\n"
+        "docker executor container to provide docker\n"
+        "CLI access to the docker daemon. This must be the\n"
+        "path used by the slave's docker image.\n",
+        "/var/run/docker.sock");
+
     // This help message for --modules flag is the same for
     // {master,slave,tests}/flags.hpp and should always be kept in
     // sync.
@@ -150,6 +158,7 @@ public:
   std::string source_dir;
   std::string build_dir;
   std::string docker;
+  std::string docker_socket;
   Option<Modules> modules;
   Option<std::string> isolation;
   std::string authenticators;

http://git-wip-us.apache.org/repos/asf/mesos/blob/9d882918/src/tests/hook_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/hook_tests.cpp b/src/tests/hook_tests.cpp
index cfde49e..5ecb031 100644
--- a/src/tests/hook_tests.cpp
+++ b/src/tests/hook_tests.cpp
@@ -527,7 +527,8 @@ TEST_F(HookTest, ROOT_DOCKER_VerifySlavePreLaunchDockerHook)
   Try<PID<Master>> master = StartMaster();
   ASSERT_SOME(master);
 
-  MockDocker* mockDocker = new MockDocker(tests::flags.docker);
+  MockDocker* mockDocker =
+   new MockDocker(tests::flags.docker, tests::flags.docker_socket);
   Shared<Docker> docker(mockDocker);
 
   slave::Flags flags = CreateSlaveFlags();

http://git-wip-us.apache.org/repos/asf/mesos/blob/9d882918/src/tests/mesos.hpp
----------------------------------------------------------------------
diff --git a/src/tests/mesos.hpp b/src/tests/mesos.hpp
index b2160f5..8435109 100644
--- a/src/tests/mesos.hpp
+++ b/src/tests/mesos.hpp
@@ -967,7 +967,7 @@ public:
 class MockDocker : public Docker
 {
 public:
-  MockDocker(const std::string& path) : Docker(path)
+  MockDocker(const std::string& path, const std::string &socket) : Docker(path, socket)
   {
     EXPECT_CALL(*this, pull(_, _, _))
       .WillRepeatedly(Invoke(this, &MockDocker::_pull));