11package server
22
33import (
4- "bufio"
5- "bytes"
64 "runtime"
75 "time"
86
@@ -1393,35 +1391,27 @@ func (s *Server) postContainerExecCreate(eng *engine.Engine, version version.Ver
13931391 if err := parseForm (r ); err != nil {
13941392 return nil
13951393 }
1396- var (
1397- name = vars ["name" ]
1398- job = eng .Job ("execCreate" , name )
1399- stdoutBuffer = bytes .NewBuffer (nil )
1400- outWarnings []string
1401- warnings = bytes .NewBuffer (nil )
1402- )
1394+ name := vars ["name" ]
14031395
1404- if err := job .DecodeEnv (r .Body ); err != nil {
1396+ execConfig := & runconfig.ExecConfig {}
1397+ if err := json .NewDecoder (r .Body ).Decode (execConfig ); err != nil {
14051398 return err
14061399 }
1400+ execConfig .Container = name
1401+
1402+ if len (execConfig .Cmd ) == 0 {
1403+ return fmt .Errorf ("No exec command specified" )
1404+ }
14071405
1408- job .Stdout .Add (stdoutBuffer )
1409- // Read warnings from stderr
1410- job .Stderr .Add (warnings )
14111406 // Register an instance of Exec in container.
1412- if err := job .Run (); err != nil {
1413- fmt .Fprintf (os .Stderr , "Error setting up exec command in container %s: %s\n " , name , err )
1407+ id , err := s .daemon .ContainerExecCreate (execConfig )
1408+ if err != nil {
1409+ logrus .Errorf ("Error setting up exec command in container %s: %s" , name , err )
14141410 return err
14151411 }
1416- // Parse warnings from stderr
1417- scanner := bufio .NewScanner (warnings )
1418- for scanner .Scan () {
1419- outWarnings = append (outWarnings , scanner .Text ())
1420- }
14211412
14221413 return writeJSON (w , http .StatusCreated , & types.ContainerExecCreateResponse {
1423- ID : engine .Tail (stdoutBuffer , 1 ),
1424- Warnings : outWarnings ,
1414+ ID : id ,
14251415 })
14261416}
14271417
@@ -1431,15 +1421,18 @@ func (s *Server) postContainerExecStart(eng *engine.Engine, version version.Vers
14311421 return nil
14321422 }
14331423 var (
1434- name = vars ["name" ]
1435- job = eng .Job ("execStart" , name )
1436- errOut io.Writer = os .Stderr
1424+ execName = vars ["name" ]
1425+ stdin io.ReadCloser
1426+ stdout io.Writer
1427+ stderr io.Writer
14371428 )
14381429
1439- if err := job .DecodeEnv (r .Body ); err != nil {
1430+ execStartCheck := & types.ExecStartCheck {}
1431+ if err := json .NewDecoder (r .Body ).Decode (execStartCheck ); err != nil {
14401432 return err
14411433 }
1442- if ! job .GetenvBool ("Detach" ) {
1434+
1435+ if ! execStartCheck .Detach {
14431436 // Setting up the streaming http interface.
14441437 inStream , outStream , err := hijackServer (w )
14451438 if err != nil {
@@ -1455,21 +1448,20 @@ func (s *Server) postContainerExecStart(eng *engine.Engine, version version.Vers
14551448 fmt .Fprintf (outStream , "HTTP/1.1 200 OK\r \n Content-Type: application/vnd.docker.raw-stream\r \n \r \n " )
14561449 }
14571450
1458- if ! job . GetenvBool ( " Tty" ) && version .GreaterThanOrEqualTo ("1.6" ) {
1451+ if ! execStartCheck . Tty && version .GreaterThanOrEqualTo ("1.6" ) {
14591452 errStream = stdcopy .NewStdWriter (outStream , stdcopy .Stderr )
14601453 outStream = stdcopy .NewStdWriter (outStream , stdcopy .Stdout )
14611454 } else {
14621455 errStream = outStream
14631456 }
1464- job .Stdin .Add (inStream )
1465- job .Stdout .Add (outStream )
1466- job .Stderr .Set (errStream )
1467- errOut = outStream
1457+ stdin = inStream
1458+ stdout = outStream
1459+ stderr = errStream
14681460 }
14691461 // Now run the user process in container.
1470- job . SetCloseIO ( false )
1471- if err := job . Run ( ); err != nil {
1472- fmt . Fprintf ( errOut , "Error starting exec command in container %s: %s\n " , name , err )
1462+
1463+ if err := s . daemon . ContainerExecStart ( execName , stdin , stdout , stderr ); err != nil {
1464+ logrus . Errorf ( "Error starting exec command in container %s: %s" , execName , err )
14731465 return err
14741466 }
14751467 w .WriteHeader (http .StatusNoContent )
0 commit comments