From dbfb3eb92391d90741be3238551a0fffcf2dbcdc Mon Sep 17 00:00:00 2001 From: Solomon Hykes Date: Thu, 20 Jun 2013 14:29:34 -0700 Subject: [PATCH 1/4] - Builder: hotfix for bug introduced in 3adf9ce04ef1632f82f7bd1585c135bb141aa450 --- commands.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commands.go b/commands.go index 6ff9ac4425..2a3979ba5e 100644 --- a/commands.go +++ b/commands.go @@ -197,7 +197,7 @@ func (cli *DockerCli) CmdBuild(args ...string) error { v := &url.Values{} v.Set("t", *tag) // Send the multipart request with correct content-type - req, err := http.NewRequest("POST", fmt.Sprintf("/v%s/build?%s", APIVERSION, v.Encode()), multipartBody) + req, err := http.NewRequest("POST", fmt.Sprintf("/v%g/build?%s", APIVERSION, v.Encode()), multipartBody) if err != nil { return err } From 02f0c1e46d1d73677aed899c1f0deaa69ab11ffc Mon Sep 17 00:00:00 2001 From: Solomon Hykes Date: Thu, 20 Jun 2013 14:33:59 -0700 Subject: [PATCH 2/4] Bump version to 0.4.4 --- CHANGELOG.md | 3 +++ commands.go | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fa255e7c40..1144800150 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +## 0.4.4 (2013-06-19) + - Builder: fix a regression introduced in 0.4.3 which caused builds to fail on new clients. + ## 0.4.3 (2013-06-19) + Builder: ADD of a local file will detect tar archives and unpack them * Runtime: Remove bsdtar dependency diff --git a/commands.go b/commands.go index 2a3979ba5e..7cd981571b 100644 --- a/commands.go +++ b/commands.go @@ -29,7 +29,7 @@ import ( "unicode" ) -const VERSION = "0.4.3" +const VERSION = "0.4.4" var ( GITCOMMIT string From 08825fa611cf5067b99bed452ffe6320ed00003a Mon Sep 17 00:00:00 2001 From: "Guillaume J. Charmes" Date: Thu, 20 Jun 2013 16:31:11 -0700 Subject: [PATCH 3/4] remove unused files --- getKernelVersion_darwin.go | 10 ------ getKernelVersion_linux.go | 71 -------------------------------------- 2 files changed, 81 deletions(-) delete mode 100644 getKernelVersion_darwin.go delete mode 100644 getKernelVersion_linux.go diff --git a/getKernelVersion_darwin.go b/getKernelVersion_darwin.go deleted file mode 100644 index 2fce282716..0000000000 --- a/getKernelVersion_darwin.go +++ /dev/null @@ -1,10 +0,0 @@ -package docker - -import ( - "fmt" - "github.com/dotcloud/docker/utils" -) - -func getKernelVersion() (*utils.KernelVersionInfo, error) { - return nil, fmt.Errorf("Kernel version detection is not available on darwin") -} diff --git a/getKernelVersion_linux.go b/getKernelVersion_linux.go deleted file mode 100644 index 4f9c7db70c..0000000000 --- a/getKernelVersion_linux.go +++ /dev/null @@ -1,71 +0,0 @@ -package docker - -import ( - "bytes" - "github.com/dotcloud/docker/utils" - "strconv" - "strings" - "syscall" -) - -// FIXME: Move this to utils package -func getKernelVersion() (*utils.KernelVersionInfo, error) { - var ( - uts syscall.Utsname - flavor string - kernel, major, minor int - err error - ) - - if err := syscall.Uname(&uts); err != nil { - return nil, err - } - - release := make([]byte, len(uts.Release)) - - i := 0 - for _, c := range uts.Release { - release[i] = byte(c) - i++ - } - - // Remove the \x00 from the release for Atoi to parse correctly - release = release[:bytes.IndexByte(release, 0)] - - tmp := strings.SplitN(string(release), "-", 2) - tmp2 := strings.SplitN(tmp[0], ".", 3) - - if len(tmp2) > 0 { - kernel, err = strconv.Atoi(tmp2[0]) - if err != nil { - return nil, err - } - } - - if len(tmp2) > 1 { - major, err = strconv.Atoi(tmp2[1]) - if err != nil { - return nil, err - } - } - - if len(tmp2) > 2 { - minor, err = strconv.Atoi(tmp2[2]) - if err != nil { - return nil, err - } - } - - if len(tmp) == 2 { - flavor = tmp[1] - } else { - flavor = "" - } - - return &utils.KernelVersionInfo{ - Kernel: kernel, - Major: major, - Minor: minor, - Flavor: flavor, - }, nil -} From b419699ab8f79f4826ec94583c6f7a46f74eeaa2 Mon Sep 17 00:00:00 2001 From: "Guillaume J. Charmes" Date: Thu, 20 Jun 2013 18:18:36 -0700 Subject: [PATCH 4/4] Use hijack for logs instead of stream --- api.go | 2 ++ commands.go | 12 +++++++++--- server.go | 8 ++++---- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/api.go b/api.go index 0b89fcf323..403254649b 100644 --- a/api.go +++ b/api.go @@ -816,6 +816,7 @@ func createRouter(srv *Server, logging bool) (*mux.Router, error) { localFct := fct f := func(w http.ResponseWriter, r *http.Request) { utils.Debugf("Calling %s %s", localMethod, localRoute) + if logging { log.Println(r.Method, r.RequestURI) } @@ -836,6 +837,7 @@ func createRouter(srv *Server, logging bool) (*mux.Router, error) { w.WriteHeader(http.StatusNotFound) return } + if err := localFct(srv, version, w, r, mux.Vars(r)); err != nil { httpError(w, err) } diff --git a/commands.go b/commands.go index 7cd981571b..1f3426f900 100644 --- a/commands.go +++ b/commands.go @@ -1036,10 +1036,10 @@ func (cli *DockerCli) CmdLogs(args ...string) error { return nil } - if err := cli.stream("POST", "/containers/"+cmd.Arg(0)+"/attach?logs=1&stdout=1", nil, os.Stdout); err != nil { + if err := cli.hijack("POST", "/containers/"+cmd.Arg(0)+"/attach?logs=1&stdout=1", false, nil, os.Stdout); err != nil { return err } - if err := cli.stream("POST", "/containers/"+cmd.Arg(0)+"/attach?logs=1&stderr=1", nil, os.Stderr); err != nil { + if err := cli.hijack("POST", "/containers/"+cmd.Arg(0)+"/attach?logs=1&stderr=1", false, nil, os.Stderr); err != nil { return err } return nil @@ -1370,6 +1370,7 @@ func (cli *DockerCli) stream(method, path string, in io.Reader, out io.Writer) e return err } defer resp.Body.Close() + if resp.StatusCode < 200 || resp.StatusCode >= 400 { body, err := ioutil.ReadAll(resp.Body) if err != nil { @@ -1407,19 +1408,24 @@ func (cli *DockerCli) stream(method, path string, in io.Reader, out io.Writer) e } func (cli *DockerCli) hijack(method, path string, setRawTerminal bool, in *os.File, out io.Writer) error { + req, err := http.NewRequest(method, fmt.Sprintf("/v%g%s", APIVERSION, path), nil) if err != nil { return err } + req.Header.Set("User-Agent", "Docker-Client/"+VERSION) req.Header.Set("Content-Type", "plain/text") + dial, err := net.Dial(cli.proto, cli.addr) if err != nil { return err } clientconn := httputil.NewClientConn(dial, nil) - clientconn.Do(req) defer clientconn.Close() + // Server hijacks the connection, error 'connection closed' expected + clientconn.Do(req) + rwc, br := clientconn.Hijack() defer rwc.Close() diff --git a/server.go b/server.go index 35388d8605..ad4f092a7f 100644 --- a/server.go +++ b/server.go @@ -979,17 +979,17 @@ func (srv *Server) ContainerAttach(name string, logs, stream, stdin, stdout, std if stdout { cLog, err := container.ReadLog("stdout") if err != nil { - utils.Debugf(err.Error()) + utils.Debugf("Error reading logs (stdout): %s", err) } else if _, err := io.Copy(out, cLog); err != nil { - utils.Debugf(err.Error()) + utils.Debugf("Error streaming logs (stdout): %s", err) } } if stderr { cLog, err := container.ReadLog("stderr") if err != nil { - utils.Debugf(err.Error()) + utils.Debugf("Error reading logs (stderr): %s", err) } else if _, err := io.Copy(out, cLog); err != nil { - utils.Debugf(err.Error()) + utils.Debugf("Error streaming logs (stderr): %s", err) } } }