A container that defines no stop timeout of its own always got 10
seconds on Linux, or 30 on Windows, to shut down before being killed.
The value was a constant in the container package, so operators who
wanted a different grace period had to pass `--stop-timeout` on every
container.
Add a `default-stop-timeout` daemon flag and configuration file option
that supplies that fallback. Stopping a container, killing it, and
computing the daemon shutdown timeout take the value from the daemon
configuration when the container has no timeout of its own, so an
explicit per-container timeout still wins and the container
configuration itself stays untouched. The option can be reloaded, and
negative values are rejected.
mergo cannot tell an unset option from a zero value, so a configured
timeout of `0`, meaning "kill immediately", would be replaced by the
non-zero flag default while merging. Remember whether the
configuration file set the option, and restore its value after the
merge.
`ContainerConfig.StopTimeout` in the API documentation no longer
claims a fixed default of 10 seconds, because the fallback is now
whatever `default-stop-timeout` holds.
Signed-off-by: Paweł Gronowski <pawel.gronowski@docker.com>
The docker command uses this package to communicate with the daemon. It can
also be used by your own Go applications to do anything the command-line
interface does; running containers, pulling or pushing images, etc.
For example, to list all containers (the equivalent of docker ps --all):
packagemainimport("context""fmt""github.com/moby/moby/client")funcmain(){// Create a new client with "client.FromEnv" (configuring the client// from commonly used environment variables such as DOCKER_HOST and// DOCKER_API_VERSION) and set a custom User-Agent.//// API-version negotiation is enabled by default to allow downgrading// the API version when connecting with an older daemon version.apiClient,err:=client.New(client.FromEnv,client.WithUserAgent("my-application/1.0.0"),)iferr!=nil{panic(err)}deferapiClient.Close()// List all containers (both stopped and running).result,err:=apiClient.ContainerList(context.Background(),client.ContainerListOptions{All:true,})iferr!=nil{panic(err)}// Print each container's ID, status and the image it was created from.fmt.Printf("%s %-22s %s\n","ID","STATUS","IMAGE")for_,ctr:=rangeresult.Items{fmt.Printf("%s %-22s %s\n",ctr.ID,ctr.Status,ctr.Image)}}