94137f6df5
Commite6907243af
applied a fix for situations where the client was configured with API-version negotiation, but did not yet negotiate a version. However, the checkVersion() function that was implemented copied the semantics of cli.NegotiateAPIVersion, which ignored connection failures with the assumption that connection errors would still surface further down. However, when using the result of a failed negotiation for NewVersionError, an API version mismatch error would be produced, masking the actual connection error. This patch changes the signature of checkVersion to return unexpected errors, including failures to connect to the API. Before this patch: docker -H unix:///no/such/socket.sock secret ls "secret list" requires API version 1.25, but the Docker daemon API version is 1.24 With this patch applied: docker -H unix:///no/such/socket.sock secret ls Cannot connect to the Docker daemon at unix:///no/such/socket.sock. Is the docker daemon running? Signed-off-by: Sebastiaan van Stijn <github@gone.nl> (cherry picked from commit6aea26b431
) Conflicts: client/image_list.go client/image_list_test.go Signed-off-by: Bjorn Neergaard <bjorn.neergaard@docker.com>
40 lines
1.4 KiB
Go
40 lines
1.4 KiB
Go
package client // import "github.com/docker/docker/client"
|
|
|
|
import (
|
|
"context"
|
|
"net/url"
|
|
"strconv"
|
|
|
|
"github.com/docker/docker/api/types/container"
|
|
"github.com/docker/docker/api/types/versions"
|
|
)
|
|
|
|
// ContainerStop stops a container. In case the container fails to stop
|
|
// gracefully within a time frame specified by the timeout argument,
|
|
// it is forcefully terminated (killed).
|
|
//
|
|
// If the timeout is nil, the container's StopTimeout value is used, if set,
|
|
// otherwise the engine default. A negative timeout value can be specified,
|
|
// meaning no timeout, i.e. no forceful termination is performed.
|
|
func (cli *Client) ContainerStop(ctx context.Context, containerID string, options container.StopOptions) error {
|
|
query := url.Values{}
|
|
if options.Timeout != nil {
|
|
query.Set("t", strconv.Itoa(*options.Timeout))
|
|
}
|
|
if options.Signal != "" {
|
|
// Make sure we negotiated (if the client is configured to do so),
|
|
// as code below contains API-version specific handling of options.
|
|
//
|
|
// Normally, version-negotiation (if enabled) would not happen until
|
|
// the API request is made.
|
|
if err := cli.checkVersion(ctx); err != nil {
|
|
return err
|
|
}
|
|
if versions.GreaterThanOrEqualTo(cli.version, "1.42") {
|
|
query.Set("signal", options.Signal)
|
|
}
|
|
}
|
|
resp, err := cli.post(ctx, "/containers/"+containerID+"/stop", query, nil, nil)
|
|
ensureReaderClosed(resp)
|
|
return err
|
|
}
|