@@ -122,6 +122,36 @@ func (s *DockerSuite) TestExecApiStartMultipleTimesError(c *check.C) {
122122 startExec (c , execID , http .StatusConflict )
123123}
124124
125+ // #20638
126+ func (s * DockerSuite ) TestExecApiStartWithDetach (c * check.C ) {
127+ name := "foo"
128+ dockerCmd (c , "run" , "-d" , "-t" , "--name" , name , "busybox" , "top" )
129+ data := map [string ]interface {}{
130+ "cmd" : []string {"true" },
131+ "AttachStdin" : true ,
132+ }
133+ _ , b , err := sockRequest ("POST" , fmt .Sprintf ("/containers/%s/exec" , name ), data )
134+ c .Assert (err , checker .IsNil , check .Commentf (string (b )))
135+
136+ createResp := struct {
137+ ID string `json:"Id"`
138+ }{}
139+ c .Assert (json .Unmarshal (b , & createResp ), checker .IsNil , check .Commentf (string (b )))
140+
141+ _ , body , err := sockRequestRaw ("POST" , fmt .Sprintf ("/exec/%s/start" , createResp .ID ), strings .NewReader (`{"Detach": true}` ), "application/json" )
142+ c .Assert (err , checker .IsNil )
143+
144+ b , err = readBody (body )
145+ comment := check .Commentf ("response body: %s" , b )
146+ c .Assert (err , checker .IsNil , comment )
147+
148+ resp , _ , err := sockRequestRaw ("GET" , "/_ping" , nil , "" )
149+ c .Assert (err , checker .IsNil )
150+ if resp .StatusCode != http .StatusOK {
151+ c .Fatal ("daemon is down, it should alive" )
152+ }
153+ }
154+
125155func createExec (c * check.C , name string ) string {
126156 _ , b , err := sockRequest ("POST" , fmt .Sprintf ("/containers/%s/exec" , name ), map [string ]interface {}{"Cmd" : []string {"true" }})
127157 c .Assert (err , checker .IsNil , check .Commentf (string (b )))
0 commit comments