瀏覽代碼

bump to master

Victor Vieux 12 年之前
父節點
當前提交
9ebfcc9a15
共有 63 個文件被更改,包括 379 次插入204 次删除
  1. 4 0
      CHANGELOG.md
  2. 1 1
      README.md
  3. 44 32
      api.go
  4. 26 26
      api_test.go
  5. 0 6
      builder_client.go
  6. 4 4
      commands.go
  7. 6 1
      docs/sources/api/docker_remote_api.rst
  8. 2 2
      docs/sources/api/index.rst
  9. 1 1
      docs/sources/api/registry_api.rst
  10. 4 0
      docs/sources/commandline/command/attach.rst
  11. 4 0
      docs/sources/commandline/command/build.rst
  12. 4 0
      docs/sources/commandline/command/commit.rst
  13. 4 0
      docs/sources/commandline/command/diff.rst
  14. 4 0
      docs/sources/commandline/command/export.rst
  15. 4 0
      docs/sources/commandline/command/history.rst
  16. 4 0
      docs/sources/commandline/command/images.rst
  17. 4 0
      docs/sources/commandline/command/import.rst
  18. 4 0
      docs/sources/commandline/command/info.rst
  19. 4 0
      docs/sources/commandline/command/inspect.rst
  20. 4 0
      docs/sources/commandline/command/kill.rst
  21. 4 0
      docs/sources/commandline/command/login.rst
  22. 4 0
      docs/sources/commandline/command/logs.rst
  23. 4 0
      docs/sources/commandline/command/port.rst
  24. 4 0
      docs/sources/commandline/command/ps.rst
  25. 4 0
      docs/sources/commandline/command/pull.rst
  26. 4 0
      docs/sources/commandline/command/push.rst
  27. 4 0
      docs/sources/commandline/command/restart.rst
  28. 4 0
      docs/sources/commandline/command/rm.rst
  29. 4 0
      docs/sources/commandline/command/rmi.rst
  30. 5 1
      docs/sources/commandline/command/run.rst
  31. 4 0
      docs/sources/commandline/command/search.rst
  32. 4 0
      docs/sources/commandline/command/start.rst
  33. 4 0
      docs/sources/commandline/command/stop.rst
  34. 4 0
      docs/sources/commandline/command/tag.rst
  35. 4 0
      docs/sources/commandline/command/version.rst
  36. 4 0
      docs/sources/commandline/command/wait.rst
  37. 2 2
      docs/sources/commandline/index.rst
  38. 1 1
      docs/sources/concepts/buildingblocks.rst
  39. 1 1
      docs/sources/concepts/containers.rst
  40. 2 2
      docs/sources/concepts/index.rst
  41. 4 0
      docs/sources/contributing/contributing.rst
  42. 3 3
      docs/sources/examples/python_web_app.rst
  43. 4 0
      docs/sources/faq.rst
  44. 4 0
      docs/sources/index/variable.rst
  45. 4 0
      docs/sources/installation/amazon.rst
  46. 4 0
      docs/sources/installation/archlinux.rst
  47. 4 0
      docs/sources/installation/binaries.rst
  48. 2 2
      docs/sources/installation/index.rst
  49. 47 81
      docs/sources/installation/kernel.rst
  50. 4 0
      docs/sources/installation/rackspace.rst
  51. 4 0
      docs/sources/installation/ubuntulinux.rst
  52. 4 0
      docs/sources/installation/upgrading.rst
  53. 3 0
      docs/sources/installation/vagrant.rst
  54. 3 3
      docs/sources/toctree.rst
  55. 2 2
      docs/sources/use/basics.rst
  56. 4 0
      docs/sources/use/builder.rst
  57. 2 2
      docs/sources/use/index.rst
  58. 3 0
      docs/sources/use/puppet.rst
  59. 4 0
      docs/sources/use/workingwithrepository.rst
  60. 1 1
      docs/theme/docker/layout.html
  61. 29 0
      docs/website/index.html
  62. 35 28
      packaging/ubuntu/changelog
  63. 2 2
      utils.go

+ 4 - 0
CHANGELOG.md

@@ -1,5 +1,9 @@
 # Changelog
 # Changelog
 
 
+## 0.3.3 (2013-05-23)
+ - Registry: Fix push regression
+ - Various bugfixes
+
 ## 0.3.2 (2013-05-09)
 ## 0.3.2 (2013-05-09)
  * Runtime: Store the actual archive on commit
  * Runtime: Store the actual archive on commit
  * Registry: Improve the checksum process
  * Registry: Improve the checksum process

+ 1 - 1
README.md

@@ -12,7 +12,7 @@ Docker is an open-source implementation of the deployment engine which powers [d
 It benefits directly from the experience accumulated over several years of large-scale operation and support of hundreds of thousands
 It benefits directly from the experience accumulated over several years of large-scale operation and support of hundreds of thousands
 of applications and databases.
 of applications and databases.
 
 
-![Docker L](docs/sources/static_files/lego_docker.jpg "Docker")
+![Docker L](docs/sources/concepts/images/lego_docker.jpg "Docker")
 
 
 ## Better than VMs
 ## Better than VMs
 
 

+ 44 - 32
api.go

@@ -13,6 +13,8 @@ import (
 	"strings"
 	"strings"
 )
 )
 
 
+const API_VERSION = 1.0
+
 func hijackServer(w http.ResponseWriter) (io.ReadCloser, io.Writer, error) {
 func hijackServer(w http.ResponseWriter) (io.ReadCloser, io.Writer, error) {
 	conn, _, err := w.(http.Hijacker).Hijack()
 	conn, _, err := w.(http.Hijacker).Hijack()
 	if err != nil {
 	if err != nil {
@@ -56,7 +58,7 @@ func getBoolParam(value string) (bool, error) {
 	return false, fmt.Errorf("Bad parameter")
 	return false, fmt.Errorf("Bad parameter")
 }
 }
 
 
-func getAuth(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func getAuth(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	b, err := json.Marshal(srv.registry.GetAuthConfig())
 	b, err := json.Marshal(srv.registry.GetAuthConfig())
 	if err != nil {
 	if err != nil {
 		return err
 		return err
@@ -65,7 +67,7 @@ func getAuth(srv *Server, w http.ResponseWriter, r *http.Request, vars map[strin
 	return nil
 	return nil
 }
 }
 
 
-func postAuth(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func postAuth(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	config := &auth.AuthConfig{}
 	config := &auth.AuthConfig{}
 	if err := json.NewDecoder(r.Body).Decode(config); err != nil {
 	if err := json.NewDecoder(r.Body).Decode(config); err != nil {
 		return err
 		return err
@@ -94,7 +96,7 @@ func postAuth(srv *Server, w http.ResponseWriter, r *http.Request, vars map[stri
 	return nil
 	return nil
 }
 }
 
 
-func getVersion(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func getVersion(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	m := srv.DockerVersion()
 	m := srv.DockerVersion()
 	b, err := json.Marshal(m)
 	b, err := json.Marshal(m)
 	if err != nil {
 	if err != nil {
@@ -104,7 +106,7 @@ func getVersion(srv *Server, w http.ResponseWriter, r *http.Request, vars map[st
 	return nil
 	return nil
 }
 }
 
 
-func postContainersKill(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func postContainersKill(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if vars == nil {
 	if vars == nil {
 		return fmt.Errorf("Missing parameter")
 		return fmt.Errorf("Missing parameter")
 	}
 	}
@@ -116,7 +118,7 @@ func postContainersKill(srv *Server, w http.ResponseWriter, r *http.Request, var
 	return nil
 	return nil
 }
 }
 
 
-func getContainersExport(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func getContainersExport(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if vars == nil {
 	if vars == nil {
 		return fmt.Errorf("Missing parameter")
 		return fmt.Errorf("Missing parameter")
 	}
 	}
@@ -129,7 +131,7 @@ func getContainersExport(srv *Server, w http.ResponseWriter, r *http.Request, va
 	return nil
 	return nil
 }
 }
 
 
-func getImagesJson(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func getImagesJson(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if err := parseForm(r); err != nil {
 	if err := parseForm(r); err != nil {
 		return err
 		return err
 	}
 	}
@@ -152,14 +154,14 @@ func getImagesJson(srv *Server, w http.ResponseWriter, r *http.Request, vars map
 	return nil
 	return nil
 }
 }
 
 
-func getImagesViz(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func getImagesViz(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if err := srv.ImagesViz(w); err != nil {
 	if err := srv.ImagesViz(w); err != nil {
 		return err
 		return err
 	}
 	}
 	return nil
 	return nil
 }
 }
 
 
-func getInfo(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func getInfo(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	out := srv.DockerInfo()
 	out := srv.DockerInfo()
 	b, err := json.Marshal(out)
 	b, err := json.Marshal(out)
 	if err != nil {
 	if err != nil {
@@ -169,7 +171,7 @@ func getInfo(srv *Server, w http.ResponseWriter, r *http.Request, vars map[strin
 	return nil
 	return nil
 }
 }
 
 
-func getImagesHistory(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func getImagesHistory(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if vars == nil {
 	if vars == nil {
 		return fmt.Errorf("Missing parameter")
 		return fmt.Errorf("Missing parameter")
 	}
 	}
@@ -186,7 +188,7 @@ func getImagesHistory(srv *Server, w http.ResponseWriter, r *http.Request, vars
 	return nil
 	return nil
 }
 }
 
 
-func getContainersChanges(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func getContainersChanges(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if vars == nil {
 	if vars == nil {
 		return fmt.Errorf("Missing parameter")
 		return fmt.Errorf("Missing parameter")
 	}
 	}
@@ -203,7 +205,7 @@ func getContainersChanges(srv *Server, w http.ResponseWriter, r *http.Request, v
 	return nil
 	return nil
 }
 }
 
 
-func getContainersPs(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func getContainersPs(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if err := parseForm(r); err != nil {
 	if err := parseForm(r); err != nil {
 		return err
 		return err
 	}
 	}
@@ -227,7 +229,7 @@ func getContainersPs(srv *Server, w http.ResponseWriter, r *http.Request, vars m
 	return nil
 	return nil
 }
 }
 
 
-func postImagesTag(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func postImagesTag(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if err := parseForm(r); err != nil {
 	if err := parseForm(r); err != nil {
 		return err
 		return err
 	}
 	}
@@ -249,7 +251,7 @@ func postImagesTag(srv *Server, w http.ResponseWriter, r *http.Request, vars map
 	return nil
 	return nil
 }
 }
 
 
-func postCommit(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func postCommit(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if err := parseForm(r); err != nil {
 	if err := parseForm(r); err != nil {
 		return err
 		return err
 	}
 	}
@@ -276,7 +278,7 @@ func postCommit(srv *Server, w http.ResponseWriter, r *http.Request, vars map[st
 }
 }
 
 
 // Creates an image from Pull or from Import
 // Creates an image from Pull or from Import
-func postImagesCreate(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func postImagesCreate(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if err := parseForm(r); err != nil {
 	if err := parseForm(r); err != nil {
 		return err
 		return err
 	}
 	}
@@ -299,7 +301,7 @@ func postImagesCreate(srv *Server, w http.ResponseWriter, r *http.Request, vars
 	return nil
 	return nil
 }
 }
 
 
-func getImagesSearch(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func getImagesSearch(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if err := parseForm(r); err != nil {
 	if err := parseForm(r); err != nil {
 		return err
 		return err
 	}
 	}
@@ -317,7 +319,7 @@ func getImagesSearch(srv *Server, w http.ResponseWriter, r *http.Request, vars m
 	return nil
 	return nil
 }
 }
 
 
-func postImagesInsert(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func postImagesInsert(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if err := parseForm(r); err != nil {
 	if err := parseForm(r); err != nil {
 		return err
 		return err
 	}
 	}
@@ -335,7 +337,7 @@ func postImagesInsert(srv *Server, w http.ResponseWriter, r *http.Request, vars
 	return nil
 	return nil
 }
 }
 
 
-func postImagesPush(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func postImagesPush(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if err := parseForm(r); err != nil {
 	if err := parseForm(r); err != nil {
 		return err
 		return err
 	}
 	}
@@ -352,7 +354,7 @@ func postImagesPush(srv *Server, w http.ResponseWriter, r *http.Request, vars ma
 	return nil
 	return nil
 }
 }
 
 
-func postContainersCreate(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func postContainersCreate(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	config := &Config{}
 	config := &Config{}
 	if err := json.NewDecoder(r.Body).Decode(config); err != nil {
 	if err := json.NewDecoder(r.Body).Decode(config); err != nil {
 		return err
 		return err
@@ -382,7 +384,7 @@ func postContainersCreate(srv *Server, w http.ResponseWriter, r *http.Request, v
 	return nil
 	return nil
 }
 }
 
 
-func postContainersRestart(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func postContainersRestart(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if err := parseForm(r); err != nil {
 	if err := parseForm(r); err != nil {
 		return err
 		return err
 	}
 	}
@@ -401,7 +403,7 @@ func postContainersRestart(srv *Server, w http.ResponseWriter, r *http.Request,
 	return nil
 	return nil
 }
 }
 
 
-func deleteContainers(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func deleteContainers(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if err := parseForm(r); err != nil {
 	if err := parseForm(r); err != nil {
 		return err
 		return err
 	}
 	}
@@ -421,7 +423,7 @@ func deleteContainers(srv *Server, w http.ResponseWriter, r *http.Request, vars
 	return nil
 	return nil
 }
 }
 
 
-func deleteImages(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func deleteImages(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if vars == nil {
 	if vars == nil {
 		return fmt.Errorf("Missing parameter")
 		return fmt.Errorf("Missing parameter")
 	}
 	}
@@ -433,7 +435,7 @@ func deleteImages(srv *Server, w http.ResponseWriter, r *http.Request, vars map[
 	return nil
 	return nil
 }
 }
 
 
-func postContainersStart(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func postContainersStart(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if vars == nil {
 	if vars == nil {
 		return fmt.Errorf("Missing parameter")
 		return fmt.Errorf("Missing parameter")
 	}
 	}
@@ -445,7 +447,7 @@ func postContainersStart(srv *Server, w http.ResponseWriter, r *http.Request, va
 	return nil
 	return nil
 }
 }
 
 
-func postContainersStop(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func postContainersStop(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if err := parseForm(r); err != nil {
 	if err := parseForm(r); err != nil {
 		return err
 		return err
 	}
 	}
@@ -466,7 +468,7 @@ func postContainersStop(srv *Server, w http.ResponseWriter, r *http.Request, var
 	return nil
 	return nil
 }
 }
 
 
-func postContainersWait(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func postContainersWait(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if vars == nil {
 	if vars == nil {
 		return fmt.Errorf("Missing parameter")
 		return fmt.Errorf("Missing parameter")
 	}
 	}
@@ -483,7 +485,7 @@ func postContainersWait(srv *Server, w http.ResponseWriter, r *http.Request, var
 	return nil
 	return nil
 }
 }
 
 
-func postContainersAttach(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func postContainersAttach(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if err := parseForm(r); err != nil {
 	if err := parseForm(r); err != nil {
 		return err
 		return err
 	}
 	}
@@ -526,7 +528,7 @@ func postContainersAttach(srv *Server, w http.ResponseWriter, r *http.Request, v
 	return nil
 	return nil
 }
 }
 
 
-func getContainersByName(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func getContainersByName(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if vars == nil {
 	if vars == nil {
 		return fmt.Errorf("Missing parameter")
 		return fmt.Errorf("Missing parameter")
 	}
 	}
@@ -544,7 +546,7 @@ func getContainersByName(srv *Server, w http.ResponseWriter, r *http.Request, va
 	return nil
 	return nil
 }
 }
 
 
-func getImagesByName(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func getImagesByName(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	if vars == nil {
 	if vars == nil {
 		return fmt.Errorf("Missing parameter")
 		return fmt.Errorf("Missing parameter")
 	}
 	}
@@ -562,7 +564,7 @@ func getImagesByName(srv *Server, w http.ResponseWriter, r *http.Request, vars m
 	return nil
 	return nil
 }
 }
 
 
-func postImagesGetCache(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+func postImagesGetCache(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	apiConfig := &ApiImageConfig{}
 	apiConfig := &ApiImageConfig{}
 	if err := json.NewDecoder(r.Body).Decode(apiConfig); err != nil {
 	if err := json.NewDecoder(r.Body).Decode(apiConfig); err != nil {
 		return err
 		return err
@@ -589,7 +591,7 @@ func ListenAndServe(addr string, srv *Server, logging bool) error {
 	r := mux.NewRouter()
 	r := mux.NewRouter()
 	log.Printf("Listening for HTTP on %s\n", addr)
 	log.Printf("Listening for HTTP on %s\n", addr)
 
 
-	m := map[string]map[string]func(*Server, http.ResponseWriter, *http.Request, map[string]string) error{
+	m := map[string]map[string]func(*Server, float64, http.ResponseWriter, *http.Request, map[string]string) error{
 		"GET": {
 		"GET": {
 			"/auth":                         getAuth,
 			"/auth":                         getAuth,
 			"/version":                      getVersion,
 			"/version":                      getVersion,
@@ -633,7 +635,7 @@ func ListenAndServe(addr string, srv *Server, logging bool) error {
 			localRoute := route
 			localRoute := route
 			localMethod := method
 			localMethod := method
 			localFct := fct
 			localFct := fct
-			r.Path(localRoute).Methods(localMethod).HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+			f := func(w http.ResponseWriter, r *http.Request) {
 				utils.Debugf("Calling %s %s", localMethod, localRoute)
 				utils.Debugf("Calling %s %s", localMethod, localRoute)
 				if logging {
 				if logging {
 					log.Println(r.Method, r.RequestURI)
 					log.Println(r.Method, r.RequestURI)
@@ -644,10 +646,20 @@ func ListenAndServe(addr string, srv *Server, logging bool) error {
 						utils.Debugf("Warning: client and server don't have the same version (client: %s, server: %s)", userAgent[1], VERSION)
 						utils.Debugf("Warning: client and server don't have the same version (client: %s, server: %s)", userAgent[1], VERSION)
 					}
 					}
 				}
 				}
-				if err := localFct(srv, w, r, mux.Vars(r)); err != nil {
+				version, err := strconv.ParseFloat(mux.Vars(r)["version"], 64)
+				if err != nil {
+					version = API_VERSION
+				}
+				if version == 0 || version > API_VERSION {
+					w.WriteHeader(http.StatusNotFound)
+					return
+				}
+				if err := localFct(srv, version, w, r, mux.Vars(r)); err != nil {
 					httpError(w, err)
 					httpError(w, err)
 				}
 				}
-			})
+			}
+			r.Path("/v{version:[0-9.]+}" + localRoute).Methods(localMethod).HandlerFunc(f)
+			r.Path(localRoute).Methods(localMethod).HandlerFunc(f)
 		}
 		}
 	}
 	}
 
 

+ 26 - 26
api_test.go

@@ -48,7 +48,7 @@ func TestGetAuth(t *testing.T) {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 
 
-	if err := postAuth(srv, r, req, nil); err != nil {
+	if err := postAuth(srv, API_VERSION, r, req, nil); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 
 
@@ -74,7 +74,7 @@ func TestGetVersion(t *testing.T) {
 
 
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
 
 
-	if err := getVersion(srv, r, nil, nil); err != nil {
+	if err := getVersion(srv, API_VERSION, r, nil, nil); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 
 
@@ -98,7 +98,7 @@ func TestGetInfo(t *testing.T) {
 
 
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
 
 
-	if err := getInfo(srv, r, nil, nil); err != nil {
+	if err := getInfo(srv, API_VERSION, r, nil, nil); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 
 
@@ -129,7 +129,7 @@ func TestGetImagesJson(t *testing.T) {
 
 
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
 
 
-	if err := getImagesJson(srv, r, req, nil); err != nil {
+	if err := getImagesJson(srv, API_VERSION, r, req, nil); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 
 
@@ -154,7 +154,7 @@ func TestGetImagesJson(t *testing.T) {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 
 
-	if err := getImagesJson(srv, r2, req2, nil); err != nil {
+	if err := getImagesJson(srv, API_VERSION, r2, req2, nil); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 
 
@@ -179,7 +179,7 @@ func TestGetImagesJson(t *testing.T) {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 
 
-	if err := getImagesJson(srv, r3, req3, nil); err != nil {
+	if err := getImagesJson(srv, API_VERSION, r3, req3, nil); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 
 
@@ -200,7 +200,7 @@ func TestGetImagesJson(t *testing.T) {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 
 
-	err = getImagesJson(srv, r4, req4, nil)
+	err = getImagesJson(srv, API_VERSION, r4, req4, nil)
 	if err == nil {
 	if err == nil {
 		t.Fatalf("Error expected, received none")
 		t.Fatalf("Error expected, received none")
 	}
 	}
@@ -221,7 +221,7 @@ func TestGetImagesViz(t *testing.T) {
 	srv := &Server{runtime: runtime}
 	srv := &Server{runtime: runtime}
 
 
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
-	if err := getImagesViz(srv, r, nil, nil); err != nil {
+	if err := getImagesViz(srv, API_VERSION, r, nil, nil); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 
 
@@ -258,7 +258,7 @@ func TestGetImagesSearch(t *testing.T) {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 
 
-	if err := getImagesSearch(srv, r, req, nil); err != nil {
+	if err := getImagesSearch(srv, API_VERSION, r, req, nil); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 
 
@@ -282,7 +282,7 @@ func TestGetImagesHistory(t *testing.T) {
 
 
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
 
 
-	if err := getImagesHistory(srv, r, nil, map[string]string{"name": unitTestImageName}); err != nil {
+	if err := getImagesHistory(srv, API_VERSION, r, nil, map[string]string{"name": unitTestImageName}); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 
 
@@ -305,7 +305,7 @@ func TestGetImagesByName(t *testing.T) {
 	srv := &Server{runtime: runtime}
 	srv := &Server{runtime: runtime}
 
 
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
-	if err := getImagesByName(srv, r, nil, map[string]string{"name": unitTestImageName}); err != nil {
+	if err := getImagesByName(srv, API_VERSION, r, nil, map[string]string{"name": unitTestImageName}); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 
 
@@ -342,7 +342,7 @@ func TestGetContainersPs(t *testing.T) {
 	}
 	}
 
 
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
-	if err := getContainersPs(srv, r, req, nil); err != nil {
+	if err := getContainersPs(srv, API_VERSION, r, req, nil); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	containers := []ApiContainers{}
 	containers := []ApiContainers{}
@@ -385,7 +385,7 @@ func TestGetContainersExport(t *testing.T) {
 	}
 	}
 
 
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
-	if err = getContainersExport(srv, r, nil, map[string]string{"name": container.Id}); err != nil {
+	if err = getContainersExport(srv, API_VERSION, r, nil, map[string]string{"name": container.Id}); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 
 
@@ -440,7 +440,7 @@ func TestGetContainersChanges(t *testing.T) {
 	}
 	}
 
 
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
-	if err := getContainersChanges(srv, r, nil, map[string]string{"name": container.Id}); err != nil {
+	if err := getContainersChanges(srv, API_VERSION, r, nil, map[string]string{"name": container.Id}); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	changes := []Change{}
 	changes := []Change{}
@@ -484,7 +484,7 @@ func TestGetContainersByName(t *testing.T) {
 	defer runtime.Destroy(container)
 	defer runtime.Destroy(container)
 
 
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
-	if err := getContainersByName(srv, r, nil, map[string]string{"name": container.Id}); err != nil {
+	if err := getContainersByName(srv, API_VERSION, r, nil, map[string]string{"name": container.Id}); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	outContainer := &Container{}
 	outContainer := &Container{}
@@ -515,7 +515,7 @@ func TestPostAuth(t *testing.T) {
 	srv.registry.ResetClient(authConfigOrig)
 	srv.registry.ResetClient(authConfigOrig)
 
 
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
-	if err := getAuth(srv, r, nil, nil); err != nil {
+	if err := getAuth(srv, API_VERSION, r, nil, nil); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 
 
@@ -562,7 +562,7 @@ func TestPostCommit(t *testing.T) {
 	}
 	}
 
 
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
-	if err := postCommit(srv, r, req, nil); err != nil {
+	if err := postCommit(srv, API_VERSION, r, req, nil); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	if r.Code != http.StatusCreated {
 	if r.Code != http.StatusCreated {
@@ -840,7 +840,7 @@ func TestPostContainersCreate(t *testing.T) {
 	}
 	}
 
 
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
-	if err := postContainersCreate(srv, r, req, nil); err != nil {
+	if err := postContainersCreate(srv, API_VERSION, r, req, nil); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	if r.Code != http.StatusCreated {
 	if r.Code != http.StatusCreated {
@@ -903,7 +903,7 @@ func TestPostContainersKill(t *testing.T) {
 	}
 	}
 
 
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
-	if err := postContainersKill(srv, r, nil, map[string]string{"name": container.Id}); err != nil {
+	if err := postContainersKill(srv, API_VERSION, r, nil, map[string]string{"name": container.Id}); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	if r.Code != http.StatusNoContent {
 	if r.Code != http.StatusNoContent {
@@ -951,7 +951,7 @@ func TestPostContainersRestart(t *testing.T) {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
-	if err := postContainersRestart(srv, r, req, map[string]string{"name": container.Id}); err != nil {
+	if err := postContainersRestart(srv, API_VERSION, r, req, map[string]string{"name": container.Id}); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	if r.Code != http.StatusNoContent {
 	if r.Code != http.StatusNoContent {
@@ -992,7 +992,7 @@ func TestPostContainersStart(t *testing.T) {
 	defer runtime.Destroy(container)
 	defer runtime.Destroy(container)
 
 
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
-	if err := postContainersStart(srv, r, nil, map[string]string{"name": container.Id}); err != nil {
+	if err := postContainersStart(srv, API_VERSION, r, nil, map[string]string{"name": container.Id}); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	if r.Code != http.StatusNoContent {
 	if r.Code != http.StatusNoContent {
@@ -1007,7 +1007,7 @@ func TestPostContainersStart(t *testing.T) {
 	}
 	}
 
 
 	r = httptest.NewRecorder()
 	r = httptest.NewRecorder()
-	if err = postContainersStart(srv, r, nil, map[string]string{"name": container.Id}); err == nil {
+	if err = postContainersStart(srv, API_VERSION, r, nil, map[string]string{"name": container.Id}); err == nil {
 		t.Fatalf("A running containter should be able to be started")
 		t.Fatalf("A running containter should be able to be started")
 	}
 	}
 
 
@@ -1054,7 +1054,7 @@ func TestPostContainersStop(t *testing.T) {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
-	if err := postContainersStop(srv, r, req, map[string]string{"name": container.Id}); err != nil {
+	if err := postContainersStop(srv, API_VERSION, r, req, map[string]string{"name": container.Id}); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	if r.Code != http.StatusNoContent {
 	if r.Code != http.StatusNoContent {
@@ -1092,7 +1092,7 @@ func TestPostContainersWait(t *testing.T) {
 
 
 	setTimeout(t, "Wait timed out", 3*time.Second, func() {
 	setTimeout(t, "Wait timed out", 3*time.Second, func() {
 		r := httptest.NewRecorder()
 		r := httptest.NewRecorder()
-		if err := postContainersWait(srv, r, nil, map[string]string{"name": container.Id}); err != nil {
+		if err := postContainersWait(srv, API_VERSION, r, nil, map[string]string{"name": container.Id}); err != nil {
 			t.Fatal(err)
 			t.Fatal(err)
 		}
 		}
 		apiWait := &ApiWait{}
 		apiWait := &ApiWait{}
@@ -1154,7 +1154,7 @@ func TestPostContainersAttach(t *testing.T) {
 			t.Fatal(err)
 			t.Fatal(err)
 		}
 		}
 
 
-		if err := postContainersAttach(srv, r, req, map[string]string{"name": container.Id}); err != nil {
+		if err := postContainersAttach(srv, API_VERSION, r, req, map[string]string{"name": container.Id}); err != nil {
 			t.Fatal(err)
 			t.Fatal(err)
 		}
 		}
 	}()
 	}()
@@ -1224,7 +1224,7 @@ func TestDeleteContainers(t *testing.T) {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	r := httptest.NewRecorder()
 	r := httptest.NewRecorder()
-	if err := deleteContainers(srv, r, req, map[string]string{"name": container.Id}); err != nil {
+	if err := deleteContainers(srv, API_VERSION, r, req, map[string]string{"name": container.Id}); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 	if r.Code != http.StatusNoContent {
 	if r.Code != http.StatusNoContent {

+ 0 - 6
builder_client.go

@@ -32,12 +32,6 @@ type builderClient struct {
 }
 }
 
 
 func (b *builderClient) clearTmp(containers, images map[string]struct{}) {
 func (b *builderClient) clearTmp(containers, images map[string]struct{}) {
-	for c := range containers {
-		if _, _, err := b.cli.call("DELETE", "/containers/"+c, nil); err != nil {
-			utils.Debugf("%s", err)
-		}
-		utils.Debugf("Removing container %s", c)
-	}
 	for i := range images {
 	for i := range images {
 		if _, _, err := b.cli.call("DELETE", "/images/"+i, nil); err != nil {
 		if _, _, err := b.cli.call("DELETE", "/images/"+i, nil); err != nil {
 			utils.Debugf("%s", err)
 			utils.Debugf("%s", err)

+ 4 - 4
commands.go

@@ -24,7 +24,7 @@ import (
 	"unicode"
 	"unicode"
 )
 )
 
 
-const VERSION = "0.3.2"
+const VERSION = "0.3.3"
 
 
 var (
 var (
 	GIT_COMMIT string
 	GIT_COMMIT string
@@ -1167,7 +1167,7 @@ func (cli *DockerCli) call(method, path string, data interface{}) ([]byte, int,
 		params = bytes.NewBuffer(buf)
 		params = bytes.NewBuffer(buf)
 	}
 	}
 
 
-	req, err := http.NewRequest(method, fmt.Sprintf("http://%s:%d", cli.addr, cli.port)+path, params)
+	req, err := http.NewRequest(method, fmt.Sprintf("http://%s:%d/v%g%s", cli.addr, cli.port, API_VERSION, path), params)
 	if err != nil {
 	if err != nil {
 		return nil, -1, err
 		return nil, -1, err
 	}
 	}
@@ -1199,7 +1199,7 @@ func (cli *DockerCli) stream(method, path string, in io.Reader, out io.Writer) e
 	if (method == "POST" || method == "PUT") && in == nil {
 	if (method == "POST" || method == "PUT") && in == nil {
 		in = bytes.NewReader([]byte{})
 		in = bytes.NewReader([]byte{})
 	}
 	}
-	req, err := http.NewRequest(method, fmt.Sprintf("http://%s:%d%s", cli.addr, cli.port, path), in)
+	req, err := http.NewRequest(method, fmt.Sprintf("http://%s:%d/v%f%s", cli.addr, cli.port, API_VERSION, path), in)
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}
@@ -1230,7 +1230,7 @@ func (cli *DockerCli) stream(method, path string, in io.Reader, out io.Writer) e
 }
 }
 
 
 func (cli *DockerCli) hijack(method, path string, setRawTerminal bool) error {
 func (cli *DockerCli) hijack(method, path string, setRawTerminal bool) error {
-	req, err := http.NewRequest(method, path, nil)
+	req, err := http.NewRequest(method, fmt.Sprintf("/v%f%s", API_VERSION, path), nil)
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}

+ 6 - 1
docs/sources/api/docker_remote_api.rst

@@ -1,3 +1,7 @@
+:title: Remote API
+:description: API Documentation for Docker
+:keywords: API, Docker, rcli, REST, documentation
+
 =================
 =================
 Docker Remote API
 Docker Remote API
 =================
 =================
@@ -118,7 +122,8 @@ Create a container
 	.. sourcecode:: http
 	.. sourcecode:: http
 
 
 	   HTTP/1.1 201 OK
 	   HTTP/1.1 201 OK
-	   
+	   Content-Type: application/json
+
 	   {
 	   {
 		"Id":"e90e34656806"
 		"Id":"e90e34656806"
 		"Warnings":[]
 		"Warnings":[]

+ 2 - 2
docs/sources/api/index.rst

@@ -1,6 +1,6 @@
-:title: docker documentation
+:title: API Documentation
 :description: docker documentation
 :description: docker documentation
-:keywords:
+:keywords: docker, ipa, documentation
 
 
 API's
 API's
 =============
 =============

+ 1 - 1
docs/sources/api/registry_api.rst

@@ -1,4 +1,4 @@
-:title: docker Registry documentation
+:title: Registry Documentation
 :description: Documentation for docker Registry and Registry API
 :description: Documentation for docker Registry and Registry API
 :keywords: docker, registry, api, index
 :keywords: docker, registry, api, index
 
 

+ 4 - 0
docs/sources/commandline/command/attach.rst

@@ -1,3 +1,7 @@
+:title: Attach Command
+:description: Attach to a running container
+:keywords: attach, container, docker, documentation
+
 ===========================================
 ===========================================
 ``attach`` -- Attach to a running container
 ``attach`` -- Attach to a running container
 ===========================================
 ===========================================

+ 4 - 0
docs/sources/commandline/command/build.rst

@@ -1,3 +1,7 @@
+:title: Build Command
+:description: Build a new image from the Dockerfile passed via stdin
+:keywords: build, docker, container, documentation
+
 ========================================================
 ========================================================
 ``build`` -- Build a container from Dockerfile via stdin
 ``build`` -- Build a container from Dockerfile via stdin
 ========================================================
 ========================================================

+ 4 - 0
docs/sources/commandline/command/commit.rst

@@ -1,3 +1,7 @@
+:title: Commit Command
+:description: Create a new image from a container's changes
+:keywords: commit, docker, container, documentation
+
 ===========================================================
 ===========================================================
 ``commit`` -- Create a new image from a container's changes
 ``commit`` -- Create a new image from a container's changes
 ===========================================================
 ===========================================================

+ 4 - 0
docs/sources/commandline/command/diff.rst

@@ -1,3 +1,7 @@
+:title: Diff Command
+:description: Inspect changes on a container's filesystem
+:keywords: diff, docker, container, documentation
+
 =======================================================
 =======================================================
 ``diff`` -- Inspect changes on a container's filesystem
 ``diff`` -- Inspect changes on a container's filesystem
 =======================================================
 =======================================================

+ 4 - 0
docs/sources/commandline/command/export.rst

@@ -1,3 +1,7 @@
+:title: Export Command
+:description: Export the contents of a filesystem as a tar archive
+:keywords: export, docker, container, documentation
+
 =================================================================
 =================================================================
 ``export`` -- Stream the contents of a container as a tar archive
 ``export`` -- Stream the contents of a container as a tar archive
 =================================================================
 =================================================================

+ 4 - 0
docs/sources/commandline/command/history.rst

@@ -1,3 +1,7 @@
+:title: History Command
+:description: Show the history of an image
+:keywords: history, docker, container, documentation
+
 ===========================================
 ===========================================
 ``history`` -- Show the history of an image
 ``history`` -- Show the history of an image
 ===========================================
 ===========================================

+ 4 - 0
docs/sources/commandline/command/images.rst

@@ -1,3 +1,7 @@
+:title: Images Command
+:description: List images
+:keywords: images, docker, container, documentation
+
 =========================
 =========================
 ``images`` -- List images
 ``images`` -- List images
 =========================
 =========================

+ 4 - 0
docs/sources/commandline/command/import.rst

@@ -1,3 +1,7 @@
+:title: Import Command
+:description: Create a new filesystem image from the contents of a tarball
+:keywords: import, tarball, docker, url, documentation
+
 ==========================================================================
 ==========================================================================
 ``import`` -- Create a new filesystem image from the contents of a tarball
 ``import`` -- Create a new filesystem image from the contents of a tarball
 ==========================================================================
 ==========================================================================

+ 4 - 0
docs/sources/commandline/command/info.rst

@@ -1,3 +1,7 @@
+:title: Info Command
+:description: Display system-wide information.
+:keywords: info, docker, information, documentation
+
 ===========================================
 ===========================================
 ``info`` -- Display system-wide information
 ``info`` -- Display system-wide information
 ===========================================
 ===========================================

+ 4 - 0
docs/sources/commandline/command/inspect.rst

@@ -1,3 +1,7 @@
+:title: Inspect Command
+:description: Return low-level information on a container
+:keywords: inspect, container, docker, documentation
+
 ==========================================================
 ==========================================================
 ``inspect`` -- Return low-level information on a container
 ``inspect`` -- Return low-level information on a container
 ==========================================================
 ==========================================================

+ 4 - 0
docs/sources/commandline/command/kill.rst

@@ -1,3 +1,7 @@
+:title: Kill Command
+:description: Kill a running container
+:keywords: kill, container, docker, documentation
+
 ====================================
 ====================================
 ``kill`` -- Kill a running container
 ``kill`` -- Kill a running container
 ====================================
 ====================================

+ 4 - 0
docs/sources/commandline/command/login.rst

@@ -1,3 +1,7 @@
+:title: Login Command
+:description: Register or Login to the docker registry server
+:keywords: login, docker, documentation
+
 ============================================================
 ============================================================
 ``login`` -- Register or Login to the docker registry server
 ``login`` -- Register or Login to the docker registry server
 ============================================================
 ============================================================

+ 4 - 0
docs/sources/commandline/command/logs.rst

@@ -1,3 +1,7 @@
+:title: Logs Command
+:description: Fetch the logs of a container
+:keywords: logs, container, docker, documentation
+
 =========================================
 =========================================
 ``logs`` -- Fetch the logs of a container
 ``logs`` -- Fetch the logs of a container
 =========================================
 =========================================

+ 4 - 0
docs/sources/commandline/command/port.rst

@@ -1,3 +1,7 @@
+:title: Port Command
+:description: Lookup the public-facing port which is NAT-ed to PRIVATE_PORT
+:keywords: port, docker, container, documentation
+
 =========================================================================
 =========================================================================
 ``port`` -- Lookup the public-facing port which is NAT-ed to PRIVATE_PORT
 ``port`` -- Lookup the public-facing port which is NAT-ed to PRIVATE_PORT
 =========================================================================
 =========================================================================

+ 4 - 0
docs/sources/commandline/command/ps.rst

@@ -1,3 +1,7 @@
+:title: Ps Command
+:description: List containers
+:keywords: ps, docker, documentation, container
+
 =========================
 =========================
 ``ps`` -- List containers
 ``ps`` -- List containers
 =========================
 =========================

+ 4 - 0
docs/sources/commandline/command/pull.rst

@@ -1,3 +1,7 @@
+:title: Pull Command
+:description: Pull an image or a repository from the registry
+:keywords: pull, image, repo, repository, documentation, docker
+
 =========================================================================
 =========================================================================
 ``pull`` -- Pull an image or a repository from the docker registry server
 ``pull`` -- Pull an image or a repository from the docker registry server
 =========================================================================
 =========================================================================

+ 4 - 0
docs/sources/commandline/command/push.rst

@@ -1,3 +1,7 @@
+:title: Push Command
+:description: Push an image or a repository to the registry
+:keywords: push, docker, image, repository, documentation, repo
+
 =======================================================================
 =======================================================================
 ``push`` -- Push an image or a repository to the docker registry server
 ``push`` -- Push an image or a repository to the docker registry server
 =======================================================================
 =======================================================================

+ 4 - 0
docs/sources/commandline/command/restart.rst

@@ -1,3 +1,7 @@
+:title: Restart Command
+:description: Restart a running container
+:keywords: restart, container, docker, documentation
+
 ==========================================
 ==========================================
 ``restart`` -- Restart a running container
 ``restart`` -- Restart a running container
 ==========================================
 ==========================================

+ 4 - 0
docs/sources/commandline/command/rm.rst

@@ -1,3 +1,7 @@
+:title: Rm Command
+:description: Remove a container
+:keywords: remove, container, docker, documentation, rm
+
 ============================
 ============================
 ``rm`` -- Remove a container
 ``rm`` -- Remove a container
 ============================
 ============================

+ 4 - 0
docs/sources/commandline/command/rmi.rst

@@ -1,3 +1,7 @@
+:title: Rmi Command
+:description: Remove an image
+:keywords: rmi, remove, image, docker, documentation
+
 ==========================
 ==========================
 ``rmi`` -- Remove an image
 ``rmi`` -- Remove an image
 ==========================
 ==========================

+ 5 - 1
docs/sources/commandline/command/run.rst

@@ -1,3 +1,7 @@
+:title: Run Command
+:description: Run a command in a new container
+:keywords: run, container, docker, documentation 
+
 ===========================================
 ===========================================
 ``run`` -- Run a command in a new container
 ``run`` -- Run a command in a new container
 ===========================================
 ===========================================
@@ -19,5 +23,5 @@
       -t=false: Allocate a pseudo-tty
       -t=false: Allocate a pseudo-tty
       -u="": Username or UID
       -u="": Username or UID
       -d=[]: Set custom dns servers for the container
       -d=[]: Set custom dns servers for the container
-      -v=[]: Creates a new volumes and mount it at the specified path.
+      -v=[]: Creates a new volume and mounts it at the specified path.
       -volumes-from="": Mount all volumes from the given container.
       -volumes-from="": Mount all volumes from the given container.

+ 4 - 0
docs/sources/commandline/command/search.rst

@@ -1,3 +1,7 @@
+:title: Search Command
+:description: Searches for the TERM parameter on the Docker index and prints out a list of repositories that match.
+:keywords: search, docker, image, documentation 
+
 ===================================================================
 ===================================================================
 ``search`` -- Search for an image in the docker index
 ``search`` -- Search for an image in the docker index
 ===================================================================
 ===================================================================

+ 4 - 0
docs/sources/commandline/command/start.rst

@@ -1,3 +1,7 @@
+:title: Start Command
+:description: Start a stopped container
+:keywords: start, docker, container, documentation
+
 ======================================
 ======================================
 ``start`` -- Start a stopped container
 ``start`` -- Start a stopped container
 ======================================
 ======================================

+ 4 - 0
docs/sources/commandline/command/stop.rst

@@ -1,3 +1,7 @@
+:title: Stop Command
+:description: Stop a running container
+:keywords: stop, container, docker, documentation
+
 ====================================
 ====================================
 ``stop`` -- Stop a running container
 ``stop`` -- Stop a running container
 ====================================
 ====================================

+ 4 - 0
docs/sources/commandline/command/tag.rst

@@ -1,3 +1,7 @@
+:title: Tag Command
+:description: Tag an image into a repository
+:keywords: tag, docker, image, repository, documentation, repo
+
 =========================================
 =========================================
 ``tag`` -- Tag an image into a repository
 ``tag`` -- Tag an image into a repository
 =========================================
 =========================================

+ 4 - 0
docs/sources/commandline/command/version.rst

@@ -1,3 +1,7 @@
+:title: Version Command
+:description: 
+:keywords: version, docker, documentation
+
 ==================================================
 ==================================================
 ``version`` -- Show the docker version information
 ``version`` -- Show the docker version information
 ==================================================
 ==================================================

+ 4 - 0
docs/sources/commandline/command/wait.rst

@@ -1,3 +1,7 @@
+:title: Wait Command
+:description: Block until a container stops, then print its exit code.
+:keywords: wait, docker, container, documentation
+
 ===================================================================
 ===================================================================
 ``wait`` -- Block until a container stops, then print its exit code
 ``wait`` -- Block until a container stops, then print its exit code
 ===================================================================
 ===================================================================

+ 2 - 2
docs/sources/commandline/index.rst

@@ -1,6 +1,6 @@
-:title: docker documentation
+:title: Commands
 :description: -- todo: change me
 :description: -- todo: change me
-:keywords: todo: change me
+:keywords: todo, commands, command line, help, docker, documentation
 
 
 
 
 Commands
 Commands

+ 1 - 1
docs/sources/concepts/buildingblocks.rst

@@ -1,4 +1,4 @@
-:title: Building blocks
+:title: Building Blocks
 :description: An introduction to docker and standard containers?
 :description: An introduction to docker and standard containers?
 :keywords: containers, lxc, concepts, explanation
 :keywords: containers, lxc, concepts, explanation
 
 

+ 1 - 1
docs/sources/concepts/containers.rst

@@ -1,6 +1,6 @@
 :title: Introduction
 :title: Introduction
 :description: An introduction to docker and standard containers?
 :description: An introduction to docker and standard containers?
-:keywords: containers, lxc, concepts, explanation
+:keywords: containers, lxc, concepts, explanation, docker, documentation
 
 
 
 
 :note: This version of the introduction is temporary, just to make sure we don't break the links from the website when the documentation is updated
 :note: This version of the introduction is temporary, just to make sure we don't break the links from the website when the documentation is updated

+ 2 - 2
docs/sources/concepts/index.rst

@@ -1,6 +1,6 @@
-:title: docker documentation
+:title: Concepts
 :description: -- todo: change me
 :description: -- todo: change me
-:keywords: todo: change me
+:keywords: concepts, documentation, docker, containers
 
 
 
 
 
 

+ 4 - 0
docs/sources/contributing/contributing.rst

@@ -1,3 +1,7 @@
+:title: Contribution Guidelines
+:description: Contribution guidelines: create issues, convetions, pull requests
+:keywords: contributing, docker, documentation, help, guideline
+
 Contributing to Docker
 Contributing to Docker
 ======================
 ======================
 
 

+ 3 - 3
docs/sources/examples/python_web_app.rst

@@ -40,7 +40,7 @@ We attach to the new container to see what is going on. Ctrl-C to disconnect
 
 
 .. code-block:: bash
 .. code-block:: bash
 
 
-    BUILD_IMG=$(docker commit $BUILD_JOB _/builds/github.com/hykes/helloflask/master)
+    BUILD_IMG=$(docker commit $BUILD_JOB _/builds/github.com/shykes/helloflask/master)
 
 
 Save the changed we just made in the container to a new image called "_/builds/github.com/hykes/helloflask/master" and save the image id in the BUILD_IMG variable name.
 Save the changed we just made in the container to a new image called "_/builds/github.com/hykes/helloflask/master" and save the image id in the BUILD_IMG variable name.
 
 
@@ -58,7 +58,7 @@ Use the new image we just created and create a new container with network port 5
 .. code-block:: bash
 .. code-block:: bash
 
 
     docker logs $WEB_WORKER
     docker logs $WEB_WORKER
-     * Running on \http://0.0.0.0:5000/
+     * Running on http://0.0.0.0:5000/
 
 
 view the logs for the new container using the WEB_WORKER variable, and if everything worked as planned you should see the line "Running on http://0.0.0.0:5000/" in the log output.
 view the logs for the new container using the WEB_WORKER variable, and if everything worked as planned you should see the line "Running on http://0.0.0.0:5000/" in the log output.
 
 
@@ -70,7 +70,7 @@ lookup the public-facing port which is NAT-ed store the private port used by the
 
 
 .. code-block:: bash
 .. code-block:: bash
 
 
-    curl \http://`hostname`:$WEB_PORT
+    curl http://`hostname`:$WEB_PORT
       Hello world!
       Hello world!
 
 
 access the web app using curl. If everything worked as planned you should see the line "Hello world!" inside of your console.
 access the web app using curl. If everything worked as planned you should see the line "Hello world!" inside of your console.

+ 4 - 0
docs/sources/faq.rst

@@ -1,3 +1,7 @@
+:title: FAQ
+:description: Most frequently asked questions.
+:keywords: faq, questions, documentation, docker
+
 FAQ
 FAQ
 ===
 ===
 
 

+ 4 - 0
docs/sources/index/variable.rst

@@ -1,3 +1,7 @@
+:title: Index Environment Variable
+:description: Setting this environment variable on the docker server will change the URL docker index.
+:keywords: docker, index environment variable, documentation 
+
 =================================
 =================================
 Docker Index Environment Variable
 Docker Index Environment Variable
 =================================
 =================================

+ 4 - 0
docs/sources/installation/amazon.rst

@@ -1,3 +1,7 @@
+:title: Installation on Amazon EC2 
+:description: Docker installation on Amazon EC2 with a single vagrant command. Vagrant 1.1 or higher is required.
+:keywords: amazon ec2, virtualization, cloud, docker, documentation, installation
+
 Amazon EC2
 Amazon EC2
 ==========
 ==========
 
 

+ 4 - 0
docs/sources/installation/archlinux.rst

@@ -1,3 +1,7 @@
+:title: Installation on Arch Linux
+:description: Docker installation on Arch Linux. 
+:keywords: arch linux, virtualization, docker, documentation, installation
+
 .. _arch_linux:
 .. _arch_linux:
 
 
 Arch Linux
 Arch Linux

+ 4 - 0
docs/sources/installation/binaries.rst

@@ -1,3 +1,7 @@
+:title: Installation from Binaries
+:description: This instruction set is meant for hackers who want to try out Docker on a variety of environments.
+:keywords: binaries, installation, docker, documentation, linux
+
 .. _binaries:
 .. _binaries:
 
 
 Binaries
 Binaries

+ 2 - 2
docs/sources/installation/index.rst

@@ -1,6 +1,6 @@
-:title: docker documentation
+:title: Documentation
 :description: -- todo: change me
 :description: -- todo: change me
-:keywords: todo: change me
+:keywords: todo, docker, documentation, installation, OS support
 
 
 
 
 
 

+ 47 - 81
docs/sources/installation/kernel.rst

@@ -1,63 +1,35 @@
+:title: Kernel Requirements
+:description: Kernel supports
+:keywords: kernel requirements, kernel support, docker, installation, cgroups, namespaces
+
 .. _kernel:
 .. _kernel:
 
 
 Kernel Requirements
 Kernel Requirements
 ===================
 ===================
 
 
+In short, Docker has the following kernel requirements:
+
+- Linux version 3.8 or above.
+
+- `AUFS support <http://aufs.sourceforge.net/>`_.
+
+- Cgroups and namespaces must be enabled.
+
+
   The officially supported kernel is the one recommended by the
   The officially supported kernel is the one recommended by the
   :ref:`ubuntu_linux` installation path. It is the one that most developers
   :ref:`ubuntu_linux` installation path. It is the one that most developers
   will use, and the one that receives the most attention from the core
   will use, and the one that receives the most attention from the core
   contributors. If you decide to go with a different kernel and hit a bug,
   contributors. If you decide to go with a different kernel and hit a bug,
   please try to reproduce it with the official kernels first.
   please try to reproduce it with the official kernels first.
 
 
-If for some reason you cannot or do not want to use the "official" kernels,
+If you cannot or do not want to use the "official" kernels,
 here is some technical background about the features (both optional and
 here is some technical background about the features (both optional and
 mandatory) that docker needs to run successfully.
 mandatory) that docker needs to run successfully.
 
 
-In short, you need kernel version 3.8 (or above), compiled to include
-`AUFS support <http://aufs.sourceforge.net/>`_. Of course, you need to
-enable cgroups and namespaces.
-
-
-Namespaces and Cgroups
-----------------------
-
-You need to enable namespaces and cgroups, to the extend of what is needed
-to run LXC containers. Technically, while namespaces have been introduced
-in the early 2.6 kernels, we do not advise to try any kernel before 2.6.32
-to run LXC containers. Note that 2.6.32 has some documented issues regarding
-network namespace setup and teardown; those issues are not a risk if you
-run containers in a private environment, but can lead to denial-of-service
-attacks if you want to run untrusted code in your containers. For more details,
-see `[LP#720095 <https://bugs.launchpad.net/ubuntu/+source/linux/+bug/720095>`_.
-
-Kernels 2.6.38, and every version since 3.2, have been deployed successfully
-to run containerized production workloads. Feature-wise, there is no huge
-improvement between 2.6.38 and up to 3.6 (as far as docker is concerned!).
-
-Starting with version 3.7, the kernel has basic support for
-`Checkpoint/Restore In Userspace <http://criu.org/>`_, which is not used by
-docker at this point, but allows to suspend the state of a container to
-disk and resume it later.
-
-Version 3.8 provides improvements in stability, which are deemed necessary
-for the operation of docker. Versions 3.2 to 3.5 have been shown to
-exhibit a reproducible bug (for more details, see issue
-`#407 <https://github.com/dotcloud/docker/issues/407>`_).
-
-Version 3.8 also brings better support for the
-`setns() syscall <http://lwn.net/Articles/531381/>`_ -- but this should not
-be a concern since docker does not leverage on this feature for now.
-
-If you want a technical overview about those concepts, you might
-want to check those articles on dotCloud's blog:
-`about namespaces <http://blog.dotcloud.com/under-the-hood-linux-kernels-on-dotcloud-part>`_
-and `about cgroups <http://blog.dotcloud.com/kernel-secrets-from-the-paas-garage-part-24-c>`_.
-
+Linux version 3.8 or above
+--------------------------
 
 
-Important Note About Pre-3.8 Kernels
-------------------------------------
-
-As mentioned above, kernels before 3.8 are not stable when used with docker.
+Kernel versions 3.2 to 3.5 are not stable when used with docker.
 In some circumstances, you will experience kernel "oopses", or even crashes.
 In some circumstances, you will experience kernel "oopses", or even crashes.
 The symptoms include:
 The symptoms include:
 
 
@@ -77,6 +49,36 @@ detects something older than 3.8.
 See issue `#407 <https://github.com/dotcloud/docker/issues/407>`_ for details.
 See issue `#407 <https://github.com/dotcloud/docker/issues/407>`_ for details.
 
 
 
 
+AUFS support
+------------
+
+Docker currently relies on AUFS, an unioning filesystem.
+While AUFS is included in the kernels built by the Debian and Ubuntu
+distributions, is not part of the standard kernel. This means that if
+you decide to roll your own kernel, you will have to patch your
+kernel tree to add AUFS. The process is documented on
+`AUFS webpage <http://aufs.sourceforge.net/>`_.
+
+
+Cgroups and namespaces
+----------------------
+
+You need to enable namespaces and cgroups, to the extend of what is needed
+to run LXC containers. Technically, while namespaces have been introduced
+in the early 2.6 kernels, we do not advise to try any kernel before 2.6.32
+to run LXC containers. Note that 2.6.32 has some documented issues regarding
+network namespace setup and teardown; those issues are not a risk if you
+run containers in a private environment, but can lead to denial-of-service
+attacks if you want to run untrusted code in your containers. For more details,
+see `[LP#720095 <https://bugs.launchpad.net/ubuntu/+source/linux/+bug/720095>`_.
+
+Kernels 2.6.38, and every version since 3.2, have been deployed successfully
+to run containerized production workloads. Feature-wise, there is no huge
+improvement between 2.6.38 and up to 3.6 (as far as docker is concerned!).
+
+
+
+
 Extra Cgroup Controllers
 Extra Cgroup Controllers
 ------------------------
 ------------------------
 
 
@@ -111,39 +113,3 @@ And replace it by the following one::
     GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount"
     GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount"
 
 
 Then run ``update-grub``, and reboot.
 Then run ``update-grub``, and reboot.
-
-
-AUFS
-----
-
-Docker currently relies on AUFS, an unioning filesystem.
-While AUFS is included in the kernels built by the Debian and Ubuntu
-distributions, is not part of the standard kernel. This means that if
-you decide to roll your own kernel, you will have to patch your
-kernel tree to add AUFS. The process is documented on
-`AUFS webpage <http://aufs.sourceforge.net/>`_.
-
-Note: the AUFS patch is fairly intrusive, but for the record, people have
-successfully applied GRSEC and AUFS together, to obtain hardened production
-kernels.
-
-If you want more information about that topic, there is an
-`article about AUFS on dotCloud's blog 
-<http://blog.dotcloud.com/kernel-secrets-from-the-paas-garage-part-34-a>`_.
-
-
-BTRFS, ZFS, OverlayFS...
-------------------------
-
-There is ongoing development on docker, to implement support for
-`BTRFS <http://en.wikipedia.org/wiki/Btrfs>`_
-(see github issue `#443 <https://github.com/dotcloud/docker/issues/443>`_).
-
-People have also showed interest for `ZFS <http://en.wikipedia.org/wiki/ZFS>`_
-(using e.g. `ZFS-on-Linux <http://zfsonlinux.org/>`_) and OverlayFS.
-The latter is functionally close to AUFS, and it might end up being included
-in the stock kernel; so it's a strong candidate!
-
-Would you like to `contribute
-<https://github.com/dotcloud/docker/blob/master/CONTRIBUTING.md>`_
-support for your favorite filesystem?

+ 4 - 0
docs/sources/installation/rackspace.rst

@@ -1,3 +1,7 @@
+:title: Rackspace Cloud Installation
+:description: Installing Docker on Ubuntu proviced by Rackspace
+:keywords: Rackspace Cloud, installation, docker, linux, ubuntu
+
 ===============
 ===============
 Rackspace Cloud
 Rackspace Cloud
 ===============
 ===============

+ 4 - 0
docs/sources/installation/ubuntulinux.rst

@@ -1,3 +1,7 @@
+:title: Requirements and Installation on Ubuntu Linux
+:description: Please note this project is currently under heavy development. It should not be used in production.
+:keywords: Docker, Docker documentation, requirements, virtualbox, vagrant, git, ssh, putty, cygwin, linux
+
 .. _ubuntu_linux:
 .. _ubuntu_linux:
 
 
 Ubuntu Linux
 Ubuntu Linux

+ 4 - 0
docs/sources/installation/upgrading.rst

@@ -1,3 +1,7 @@
+:title: Upgrading
+:description: These instructions are for upgrading Docker
+:keywords: Docker, Docker documentation, upgrading docker, upgrade
+
 .. _upgrading:
 .. _upgrading:
 
 
 Upgrading
 Upgrading

+ 3 - 0
docs/sources/installation/vagrant.rst

@@ -1,3 +1,6 @@
+:title: Using Vagrant (Mac, Linux)
+:description: This guide will setup a new virtualbox virtual machine with docker installed on your computer.
+:keywords: Docker, Docker documentation, virtualbox, vagrant, git, ssh, putty, cygwin
 
 
 .. _install_using_vagrant:
 .. _install_using_vagrant:
 
 

+ 3 - 3
docs/sources/toctree.rst

@@ -1,6 +1,6 @@
-:title: docker documentation
-:description: docker documentation
-:keywords:
+:title: Documentation
+:description: -- todo: change me
+:keywords: todo, docker, documentation, installation, usage, examples, contributing, faq, command line, concepts
 
 
 Documentation
 Documentation
 =============
 =============

+ 2 - 2
docs/sources/use/basics.rst

@@ -1,6 +1,6 @@
-:title: Base commands
+:title: Basic Commands
 :description: Common usage and commands
 :description: Common usage and commands
-:keywords: Examples, Usage
+:keywords: Examples, Usage, basic commands, docker, documentation, examples
 
 
 
 
 The basics
 The basics

+ 4 - 0
docs/sources/use/builder.rst

@@ -1,3 +1,7 @@
+:title: Docker Builder
+:description: Docker Builder specifes a simple DSL which allows you to automate the steps you would normally manually take to create an image.
+:keywords: builder, docker, Docker Builder, automation, image creation
+
 ==============
 ==============
 Docker Builder
 Docker Builder
 ==============
 ==============

+ 2 - 2
docs/sources/use/index.rst

@@ -1,6 +1,6 @@
-:title: docker documentation
+:title: Documentation
 :description: -- todo: change me
 :description: -- todo: change me
-:keywords: todo: change me
+:keywords: todo, docker, documentation, basic, builder
 
 
 
 
 
 

+ 3 - 0
docs/sources/use/puppet.rst

@@ -1,3 +1,6 @@
+:title: Puppet Usage
+:description: Installating and using Puppet
+:keywords: puppet, installation, usage, docker, documentation
 
 
 .. _install_using_puppet:
 .. _install_using_puppet:
 
 

+ 4 - 0
docs/sources/use/workingwithrepository.rst

@@ -1,3 +1,7 @@
+:title: Working With Repositories
+:description: Generally, there are two types of repositories: Top-level repositories which are controlled by the people behind Docker, and user repositories.
+:keywords: repo, repositiores, usage, pull image, push image, image, documentation
+
 .. _working_with_the_repository:
 .. _working_with_the_repository:
 
 
 Working with the repository
 Working with the repository

+ 1 - 1
docs/theme/docker/layout.html

@@ -8,7 +8,7 @@
     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
     <meta name="google-site-verification" content="UxV66EKuPe87dgnH1sbrldrx6VsoWMrx5NjwkgUFxXI" />
     <meta name="google-site-verification" content="UxV66EKuPe87dgnH1sbrldrx6VsoWMrx5NjwkgUFxXI" />
 
 
-    <title>Docker - {{ meta['title'] if meta and meta['title'] else title }}</title>
+    <title>{{ meta['title'] if meta and meta['title'] else title }} - Docker Documentation</title>
 
 
     <meta name="description" content="{{ meta['description'] if meta }}" />
     <meta name="description" content="{{ meta['description'] if meta }}" />
     <meta name="keywords" content="{{ meta['keywords'] if meta }}" />
     <meta name="keywords" content="{{ meta['keywords'] if meta }}" />

+ 29 - 0
docs/website/index.html

@@ -198,6 +198,35 @@
 
 
 
 
 <div class="container">
 <div class="container">
+
+    <div class="row">
+        <div class="span6">
+            <section class="contentblock twitterblock">
+                <img src="https://si0.twimg.com/profile_images/2707460527/252a64411a339184ff375a96fb68dcb0_bigger.png">
+                <em>Mitchell Hashimoto‏@mitchellh:</em> Docker launched today. It is incredible. They’re also working RIGHT NOW on a Vagrant provider. LXC is COMING!!
+            </section>
+        </div>
+        <div class="span6">
+            <section class="contentblock twitterblock">
+                <img src="https://si0.twimg.com/profile_images/1108290260/Adam_Jacob-114x150_original_bigger.jpg">
+                <em>Adam Jacob‏@adamhjk:</em> Docker is clearly the right idea. @solomonstre absolutely killed it. Containerized app deployment is the future, I think.
+            </section>
+        </div>
+    </div>
+    <div class="row">
+        <div class="span6">
+            <section class="contentblock twitterblock">
+                <img src="https://si0.twimg.com/profile_images/14872832/twitter_pic_bigger.jpg">
+                <em>Matt Townsend‏@mtownsend:</em> I have a serious code crush on docker.io - it's Lego for PaaS. Motherfucking awesome Lego.
+            </section>
+        </div>
+        <div class="span6">
+            <section class="contentblock twitterblock">
+                <img src="https://si0.twimg.com/profile_images/1312352395/rupert-259x300_bigger.jpg">
+                <em>Rob Harrop‏@robertharrop:</em> Impressed by @getdocker - it's all kinds of magic. Serious rethink of AWS architecture happening @skillsmatter.
+            </section>
+        </div>
+    </div>
     <div class="row">
     <div class="row">
         <div class="span6">
         <div class="span6">
             <section class="contentblock twitterblock">
             <section class="contentblock twitterblock">

+ 35 - 28
packaging/ubuntu/changelog

@@ -1,37 +1,44 @@
+lxc-docker (0.3.3-1) precise; urgency=low
+  - Registry: Fix push regression
+  - Various bugfixes
+
+ -- dotCloud <ops@dotcloud.com>  Thu, 23 May 2013 00:00:00 -0700
+
+
 lxc-docker (0.3.2-1) precise; urgency=low
 lxc-docker (0.3.2-1) precise; urgency=low
- - Runtime: Store the actual archive on commit
- - Registry: Improve the checksum process
- - Registry: Use the size to have a good progress bar while pushing
- - Registry: Use the actual archive if it exists in order to speed up the push
- - Registry: Fix error 400 on push
+  - Runtime: Store the actual archive on commit
+  - Registry: Improve the checksum process
+  - Registry: Use the size to have a good progress bar while pushing
+  - Registry: Use the actual archive if it exists in order to speed up the push
+  - Registry: Fix error 400 on push
 
 
  -- dotCloud <ops@dotcloud.com>  Fri, 9 May 2013 00:00:00 -0700
  -- dotCloud <ops@dotcloud.com>  Fri, 9 May 2013 00:00:00 -0700
 
 
 
 
 lxc-docker (0.3.1-1) precise; urgency=low
 lxc-docker (0.3.1-1) precise; urgency=low
- - Builder: Implement the autorun capability within docker builder
- - Builder: Add caching to docker builder
- - Builder: Add support for docker builder with native API as top level command
- - Runtime: Add go version to debug infos
- - Builder: Implement ENV within docker builder
- - Registry: Add docker search top level command in order to search a repository
- - Images: output graph of images to dot (graphviz)
- - Documentation: new introduction and high-level overview
- - Documentation: Add the documentation for docker builder
- - Website: new high-level overview
- - Makefile: Swap "go get" for "go get -d", especially to compile on go1.1rc
- - Images: fix ByParent function
- - Builder: Check the command existance prior create and add Unit tests for the case
- - Registry: Fix pull for official images with specific tag
- - Registry: Fix issue when login in with a different user and trying to push
- - Documentation: CSS fix for docker documentation to make REST API docs look better.
- - Documentation: Fixed CouchDB example page header mistake
- - Documentation: fixed README formatting
- - Registry: Improve checksum - async calculation
- - Runtime: kernel version - don't show the dash if flavor is empty
- - Documentation: updated www.docker.io website.
- - Builder: use any whitespaces instead of tabs
- - Packaging: packaging ubuntu; issue #510: Use goland-stable PPA package to build docker
+  - Builder: Implement the autorun capability within docker builder
+  - Builder: Add caching to docker builder
+  - Builder: Add support for docker builder with native API as top level command
+  - Runtime: Add go version to debug infos
+  - Builder: Implement ENV within docker builder
+  - Registry: Add docker search top level command in order to search a repository
+  - Images: output graph of images to dot (graphviz)
+  - Documentation: new introduction and high-level overview
+  - Documentation: Add the documentation for docker builder
+  - Website: new high-level overview
+  - Makefile: Swap "go get" for "go get -d", especially to compile on go1.1rc
+  - Images: fix ByParent function
+  - Builder: Check the command existance prior create and add Unit tests for the case
+  - Registry: Fix pull for official images with specific tag
+  - Registry: Fix issue when login in with a different user and trying to push
+  - Documentation: CSS fix for docker documentation to make REST API docs look better.
+  - Documentation: Fixed CouchDB example page header mistake
+  - Documentation: fixed README formatting
+  - Registry: Improve checksum - async calculation
+  - Runtime: kernel version - don't show the dash if flavor is empty
+  - Documentation: updated www.docker.io website.
+  - Builder: use any whitespaces instead of tabs
+  - Packaging: packaging ubuntu; issue #510: Use goland-stable PPA package to build docker
 
 
  -- dotCloud <ops@dotcloud.com>  Fri, 8 May 2013 00:00:00 -0700
  -- dotCloud <ops@dotcloud.com>  Fri, 8 May 2013 00:00:00 -0700
 
 

+ 2 - 2
utils.go

@@ -49,10 +49,10 @@ func CompareConfig(a, b *Config) bool {
 }
 }
 
 
 func MergeConfig(userConf, imageConf *Config) {
 func MergeConfig(userConf, imageConf *Config) {
-	if userConf.Hostname != "" {
+	if userConf.Hostname == "" {
 		userConf.Hostname = imageConf.Hostname
 		userConf.Hostname = imageConf.Hostname
 	}
 	}
-	if userConf.User != "" {
+	if userConf.User == "" {
 		userConf.User = imageConf.User
 		userConf.User = imageConf.User
 	}
 	}
 	if userConf.Memory == 0 {
 	if userConf.Memory == 0 {