2015-03-25 06:57:23 +03:00
package client
import (
"fmt"
"net/url"
"strconv"
2015-05-05 07:18:28 +03:00
Cli "github.com/docker/docker/cli"
2015-03-25 06:57:23 +03:00
flag "github.com/docker/docker/pkg/mflag"
)
2015-10-03 18:56:41 +03:00
// CmdStop stops one or more containers.
2015-03-25 20:34:41 +03:00
//
// 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-25 06:57:23 +03:00
func ( cli * DockerCli ) CmdStop ( args ... string ) error {
2015-10-08 15:46:21 +03:00
cmd := Cli . Subcmd ( "stop" , [ ] string { "CONTAINER [CONTAINER...]" } , Cli . DockerCommands [ "stop" ] . Description + ".\nSending SIGTERM and then SIGKILL after a grace period" , true )
2015-03-25 06:57:23 +03:00
nSeconds := cmd . Int ( [ ] string { "t" , "-time" } , 10 , "Seconds to wait for stop before killing it" )
cmd . Require ( flag . Min , 1 )
2015-03-29 04:22:46 +03:00
cmd . ParseFlags ( args , true )
2015-03-25 06:57:23 +03:00
v := url . Values { }
v . Set ( "t" , strconv . Itoa ( * nSeconds ) )
2015-05-05 10:59:17 +03:00
var errNames [ ] string
2015-03-25 06:57:23 +03:00
for _ , name := range cmd . Args ( ) {
2015-01-12 22:56:01 +03:00
_ , _ , err := readBody ( cli . call ( "POST" , "/containers/" + name + "/stop?" + v . Encode ( ) , nil , nil ) )
2015-03-25 06:57:23 +03:00
if err != nil {
fmt . Fprintf ( cli . err , "%s\n" , err )
2015-05-05 10:59:17 +03:00
errNames = append ( errNames , name )
2015-03-25 06:57:23 +03:00
} else {
fmt . Fprintf ( cli . out , "%s\n" , name )
}
}
2015-05-05 10:59:17 +03:00
if len ( errNames ) > 0 {
return fmt . Errorf ( "Error: failed to stop containers: %v" , errNames )
}
return nil
2015-03-25 06:57:23 +03:00
}