2015-03-24 23:57:23 -04:00
package client
import (
"fmt"
"net/url"
"strconv"
2015-05-05 00:18:28 -04:00
Cli "github.com/docker/docker/cli"
2015-03-24 23:57:23 -04:00
flag "github.com/docker/docker/pkg/mflag"
)
2015-03-25 13:34:41 -04:00
// CmdStop stops one or more running containers.
//
// A running container is stopped by first sending SIGTERM and then SIGKILL if the container fails to stop within a grace period (the default is 10 seconds).
//
// Usage: docker stop [OPTIONS] CONTAINER [CONTAINER...]
2015-03-24 23:57:23 -04:00
func ( cli * DockerCli ) CmdStop ( args ... string ) error {
2015-05-05 00:18:28 -04:00
cmd := Cli . Subcmd ( "stop" , [ ] string { "CONTAINER [CONTAINER...]" } , "Stop a running container by sending SIGTERM and then SIGKILL after a\ngrace period" , true )
2015-03-24 23:57:23 -04:00
nSeconds := cmd . Int ( [ ] string { "t" , "-time" } , 10 , "Seconds to wait for stop before killing it" )
cmd . Require ( flag . Min , 1 )
2015-03-28 21:22:46 -04:00
cmd . ParseFlags ( args , true )
2015-03-24 23:57:23 -04:00
v := url . Values { }
v . Set ( "t" , strconv . Itoa ( * nSeconds ) )
2015-05-05 03:59:17 -04:00
var errNames [ ] string
2015-03-24 23:57:23 -04:00
for _ , name := range cmd . Args ( ) {
2015-01-12 14:56:01 -05:00
_ , _ , err := readBody ( cli . call ( "POST" , "/containers/" + name + "/stop?" + v . Encode ( ) , nil , nil ) )
2015-03-24 23:57:23 -04:00
if err != nil {
fmt . Fprintf ( cli . err , "%s\n" , err )
2015-05-05 03:59:17 -04:00
errNames = append ( errNames , name )
2015-03-24 23:57:23 -04:00
} else {
fmt . Fprintf ( cli . out , "%s\n" , name )
}
}
2015-05-05 03:59:17 -04:00
if len ( errNames ) > 0 {
return fmt . Errorf ( "Error: failed to stop containers: %v" , errNames )
}
return nil
2015-03-24 23:57:23 -04:00
}