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/04/06 00:01:23 UTC

[2/2] mesos git commit: Implemented slave default docker config file support.

Implemented slave default docker config file support.

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


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

Branch: refs/heads/master
Commit: 7c4e1ffe5d850c565c8d2ea475c189ce12b09386
Parents: 7c8285c
Author: Gilbert Song <so...@gmail.com>
Authored: Tue Apr 5 15:01:02 2016 -0700
Committer: Jie Yu <yu...@gmail.com>
Committed: Tue Apr 5 15:01:02 2016 -0700

----------------------------------------------------------------------
 src/docker/docker.cpp              | 87 +++++++++++++++++++++++++++------
 src/docker/docker.hpp              | 15 ++++--
 src/slave/containerizer/docker.cpp |  3 +-
 src/tests/mesos.cpp                |  5 +-
 src/tests/mesos.hpp                |  3 +-
 5 files changed, 91 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/7c4e1ffe/src/docker/docker.cpp
----------------------------------------------------------------------
diff --git a/src/docker/docker.cpp b/src/docker/docker.cpp
index 386f2f4..bb9ddde 100755
--- a/src/docker/docker.cpp
+++ b/src/docker/docker.cpp
@@ -97,13 +97,14 @@ static Future<Nothing> checkError(const string& cmd, const Subprocess& s)
 Try<Owned<Docker>> Docker::create(
     const string& path,
     const string& socket,
-    bool validate)
+    bool validate,
+    const Option<JSON::Object>& config)
 {
   if (!strings::startsWith(socket, "/")) {
     return Error("Invalid Docker socket path: " + socket);
   }
 
-  Owned<Docker> docker(new Docker(path, socket));
+  Owned<Docker> docker(new Docker(path, socket, config));
   if (!validate) {
     return docker;
   }
@@ -651,11 +652,8 @@ Future<Nothing> Docker::run(
 
   map<string, string> environment = os::environment();
 
-  // Currently the Docker CLI picks up dockerconfig by looking for
-  // the config file in the $HOME directory. If one of the URIs
-  // provided is a docker config file we want docker to be able to
-  // pick it up from the sandbox directory where we store all the
-  // URI downloads.
+  // NOTE: This is non-relevant to pick up a docker config file,
+  // which is necessary for private registry.
   environment["HOME"] = sandboxDirectory;
 
   Try<Subprocess> s = subprocess(
@@ -1073,7 +1071,7 @@ Future<Docker::Image> Docker::pull(
 
   if (force) {
     // Skip inspect and docker pull the image.
-    return Docker::__pull(*this, directory, image, path, socket);
+    return Docker::__pull(*this, directory, image, path, socket, config);
   }
 
   argv.push_back(path);
@@ -1115,6 +1113,7 @@ Future<Docker::Image> Docker::pull(
         dockerImage,
         path,
         socket,
+        config,
         output));
 }
 
@@ -1126,6 +1125,7 @@ Future<Docker::Image> Docker::_pull(
     const string& image,
     const string& path,
     const string& socket,
+    const Option<JSON::Object>& config,
     Future<string> output)
 {
   Option<int> status = s.status().get();
@@ -1136,7 +1136,7 @@ Future<Docker::Image> Docker::_pull(
 
   output.discard();
 
-  return Docker::__pull(docker, directory, image, path, socket);
+  return Docker::__pull(docker, directory, image, path, socket, config);
 }
 
 
@@ -1145,7 +1145,8 @@ Future<Docker::Image> Docker::__pull(
     const string& directory,
     const string& image,
     const string& path,
-    const string& socket)
+    const string& socket,
+    const Option<JSON::Object>& config)
 {
   vector<string> argv;
   argv.push_back(path);
@@ -1158,10 +1159,57 @@ Future<Docker::Image> Docker::__pull(
 
   VLOG(1) << "Running " << cmd;
 
-  // Set HOME variable to pick up .dockercfg.
-  map<string, string> environment = os::environment();
+  // Set the HOME path where docker config file locates.
+  Option<string> home;
+  if (config.isSome()) {
+    Try<string> _home = os::mkdtemp();
+
+    if (_home.isError()) {
+      return Failure("Failed to create temporary directory for docker config"
+                     "file: " + _home.error());
+    }
+
+    home = _home.get();
+
+    Result<JSON::Object> auths = config->find<JSON::Object>("auths");
+    if (auths.isError()) {
+      return Failure("Failed to find 'auths' in docker config file: " +
+                     auths.error());
+    }
+
+    const string path = auths.isSome()
+      ? path::join(home.get(), ".docker")
+      : home.get();
+
+    Try<Nothing> mkdir = os::mkdir(path);
+    if (mkdir.isError()) {
+      return Failure("Failed to create path '" + path + "': " + mkdir.error());
+    }
 
-  environment["HOME"] = directory;
+    const string file = path::join(path, auths.isSome()
+        ? "config.json"
+        : ".dockercfg");
+
+    Try<Nothing> write = os::write(file, stringify(config.get()));
+    if (write.isError()) {
+      return Failure("Failed to write docker config file to '" +
+                     file + "': " + write.error());
+    }
+  }
+
+  // Currently the Docker CLI picks up .docker/config.json (old
+  // .dockercfg by looking for the config file in the $HOME
+  // directory. The docker config file can either be specified by
+  // the agent flag '--docker_config', or by one of the URIs
+  // provided which is a docker config file we want docker to be
+  // able to pick it up from the sandbox directory where we store
+  // all the URI downloads.
+  // TODO(gilbert): Deprecate the fetching docker config file
+  // specified as URI method on 0.30.0 release.
+  map<string, string> environment = os::environment();
+  environment["HOME"] = home.isSome()
+    ? home.get()
+    : directory;
 
   Try<Subprocess> s_ = subprocess(
       path,
@@ -1188,7 +1236,18 @@ Future<Docker::Image> Docker::__pull(
         cmd,
         directory,
         image))
-    .onDiscard(lambda::bind(&commandDiscarded, s_.get(), cmd));
+    .onDiscard(lambda::bind(&commandDiscarded, s_.get(), cmd))
+    .onAny([home]() {
+      if (home.isSome()) {
+        Try<Nothing> rmdir = os::rmdir(home.get());
+
+        if (rmdir.isError()) {
+          LOG(WARNING) << "Failed to remove docker config file temporary"
+                       << "'HOME' directory '" << home.get() << "': "
+                       << rmdir.error();
+        }
+      }
+    });
 }
 
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/7c4e1ffe/src/docker/docker.hpp
----------------------------------------------------------------------
diff --git a/src/docker/docker.hpp b/src/docker/docker.hpp
index 7802f23..da6e9a2 100644
--- a/src/docker/docker.hpp
+++ b/src/docker/docker.hpp
@@ -47,7 +47,8 @@ public:
   static Try<process::Owned<Docker>> create(
       const std::string& path,
       const std::string& socket,
-      bool validate = true);
+      bool validate = true,
+      const Option<JSON::Object>& config = None());
 
   virtual ~Docker() {}
 
@@ -170,8 +171,11 @@ public:
 protected:
   // Uses the specified path to the Docker CLI tool.
   Docker(const std::string& _path,
-         const std::string& _socket)
-       : path(_path), socket("unix://" + _socket) {}
+         const std::string& _socket,
+         const Option<JSON::Object>& _config)
+       : path(_path),
+         socket("unix://" + _socket),
+         config(_config) {}
 
 private:
   static process::Future<Nothing> _run(
@@ -240,6 +244,7 @@ private:
       const std::string& image,
       const std::string& path,
       const std::string& socket,
+      const Option<JSON::Object>& config,
       process::Future<std::string> output);
 
   static process::Future<Image> __pull(
@@ -247,7 +252,8 @@ private:
       const std::string& directory,
       const std::string& image,
       const std::string& path,
-      const std::string& socket);
+      const std::string& socket,
+      const Option<JSON::Object>& config);
 
   static process::Future<Image> ___pull(
       const Docker& docker,
@@ -265,6 +271,7 @@ private:
 
   const std::string path;
   const std::string socket;
+  const Option<JSON::Object> config;
 };
 
 #endif // __DOCKER_HPP__

http://git-wip-us.apache.org/repos/asf/mesos/blob/7c4e1ffe/src/slave/containerizer/docker.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/docker.cpp b/src/slave/containerizer/docker.cpp
index 9314d1f..0576eab 100644
--- a/src/slave/containerizer/docker.cpp
+++ b/src/slave/containerizer/docker.cpp
@@ -141,7 +141,8 @@ Try<DockerContainerizer*> DockerContainerizer::create(
   Try<Owned<Docker>> create = Docker::create(
       flags.docker,
       flags.docker_socket,
-      true);
+      true,
+      flags.docker_config);
 
   if (create.isError()) {
     return Error("Failed to create docker: " + create.error());

http://git-wip-us.apache.org/repos/asf/mesos/blob/7c4e1ffe/src/tests/mesos.cpp
----------------------------------------------------------------------
diff --git a/src/tests/mesos.cpp b/src/tests/mesos.cpp
index f31163b..cf38dbb 100644
--- a/src/tests/mesos.cpp
+++ b/src/tests/mesos.cpp
@@ -566,8 +566,9 @@ MockContainerLogger::~MockContainerLogger() {}
 
 MockDocker::MockDocker(
     const string& path,
-    const string& socket)
-  : Docker(path, socket)
+    const string& socket,
+    const Option<JSON::Object>& config)
+  : Docker(path, socket, config)
 {
   EXPECT_CALL(*this, ps(_, _))
     .WillRepeatedly(Invoke(this, &MockDocker::_ps));

http://git-wip-us.apache.org/repos/asf/mesos/blob/7c4e1ffe/src/tests/mesos.hpp
----------------------------------------------------------------------
diff --git a/src/tests/mesos.hpp b/src/tests/mesos.hpp
index 98f9710..3b565b4 100644
--- a/src/tests/mesos.hpp
+++ b/src/tests/mesos.hpp
@@ -1384,7 +1384,8 @@ class MockDocker : public Docker
 public:
   MockDocker(
       const std::string& path,
-      const std::string& socket);
+      const std::string& socket,
+      const Option<JSON::Object>& config = None());
   virtual ~MockDocker();
 
   MOCK_CONST_METHOD9(