Skip to content
This repository has been archived by the owner on Nov 23, 2019. It is now read-only.

Hijack is incompatible with use of CloseNotifier #303

Open
raphink opened this issue Jul 5, 2016 · 7 comments
Open

Hijack is incompatible with use of CloseNotifier #303

raphink opened this issue Jul 5, 2016 · 7 comments

Comments

@raphink
Copy link

raphink commented Jul 5, 2016

This is caused by moby/moby#12845

package main

import (
  "fmt"
  "io/ioutil"

  "github.com/docker/engine-api/client"
  "github.com/docker/engine-api/types"
  "golang.org/x/net/context"
)

// Some basic nginx container running
const ContainerID string = "ce5d8b318ca0"

func main() {
  c, _ := client.NewClient("unix:///var/run/docker.sock", "", nil, nil)

  body, _ := c.ContainerLogs(context.Background(), ContainerID, types.ContainerLogsOptions{
    ShowStdout: true,
    ShowStderr: true,
  })

  defer body.Close()

  // This line causes ContainerExecStart to fail with
  // Error response from daemon: http: Hijack is incompatible with use of CloseNotifier
  _, _ = ioutil.ReadAll(body)

  exec, _ := c.ContainerExecCreate(context.Background(), ContainerID, types.ExecConfig{
    Cmd: []string{"date"},
  })

  err := c.ContainerExecStart(context.Background(), exec.ID, types.ExecStartCheck{})
  fmt.Println(err)
}
$ go run engine-api-bug.go 
Error response from daemon: http: Hijack is incompatible with use of CloseNotifier

How can I fix this with engine-api?

raphink added a commit to camptocamp/bivac that referenced this issue Jul 5, 2016
@cpuguy83
Copy link
Contributor

cpuguy83 commented Jul 5, 2016

This is likely from connection re-use, which is automatic from the http package.

In the client transport we'll either need to set DisableKeepAlives or maybe in ContainerExecStart we can make sure to set Close in the request?

@raphink
Copy link
Author

raphink commented Jul 5, 2016

This should work. Currently, I have to create a new Docker client for the ContainerExecStart.

@cpuguy83
Copy link
Contributor

cpuguy83 commented Jul 5, 2016

This could probably be considered a golang bug. We should not have to manually manage this when the http package knows we've hijacked the connection.

@LK4D4
Copy link
Contributor

LK4D4 commented Jul 5, 2016

I belive fix for this was on go1.6
golang/go@99fb191

@cpuguy83
Copy link
Contributor

cpuguy83 commented Jul 5, 2016

It would seem so.
@raphink any chance you can test with go 1.6?

@raphink
Copy link
Author

raphink commented Jul 5, 2016

I get this bug with all versions of go, including tip. I think it's the docker engine that needs to be rebuilt with the new version of go.

@thaJeztah
Copy link
Member

@cpuguy83 @LK4D4 saw that someone reported this issue on 1.12-rc3 (which uses go 1.6); moby/moby#12845 (comment)

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants