diff --git a/hack/vendor.sh b/hack/vendor.sh index f5cb0aba..d3feacce 100755 --- a/hack/vendor.sh +++ b/hack/vendor.sh @@ -6,7 +6,7 @@ rm -rf vendor/ source 'hack/.vendor-helpers.sh' clone git github.com/urfave/cli v1.17.0 -clone git github.com/containers/image layers-federation https://github.com/runcom/image +clone git github.com/containers/image master clone git gopkg.in/cheggaaa/pb.v1 ad4efe000aa550bb54918c06ebbadc0ff17687b9 https://github.com/cheggaaa/pb clone git github.com/Sirupsen/logrus v0.10.0 clone git github.com/go-check/check v1 diff --git a/vendor/github.com/containers/image/docker/docker_client.go b/vendor/github.com/containers/image/docker/docker_client.go index fd0b0fd1..be45cd47 100644 --- a/vendor/github.com/containers/image/docker/docker_client.go +++ b/vendor/github.com/containers/image/docker/docker_client.go @@ -4,6 +4,7 @@ import ( "crypto/tls" "encoding/base64" "encoding/json" + "errors" "fmt" "io" "io/ioutil" @@ -31,12 +32,17 @@ const ( dockerCfgObsolete = ".dockercfg" baseURL = "%s://%s/v2/" + baseURLV1 = "%s://%s/v1/_ping" tagsURL = "%s/tags/list" manifestURL = "%s/manifests/%s" blobsURL = "%s/blobs/%s" blobUploadURL = "%s/blobs/uploads/" ) +// ErrV1NotSupported is returned when we're trying to talk to a +// docker V1 registry. +var ErrV1NotSupported = errors.New("can't talk to a V1 docker registry") + // dockerClient is configuration for dealing with a single Docker registry. type dockerClient struct { ctx *types.SystemContext @@ -382,6 +388,32 @@ func (c *dockerClient) ping() (*pingResponse, error) { if err != nil && c.ctx != nil && c.ctx.DockerInsecureSkipTLSVerify { pr, err = ping("http") } + if err != nil { + // best effort to understand if we're talking to a V1 registry + pingV1 := func(scheme string) bool { + url := fmt.Sprintf(baseURLV1, scheme, c.registry) + resp, err := c.makeRequestToResolvedURL("GET", url, nil, nil, -1, true) + logrus.Debugf("Ping %s err %#v", url, err) + if err != nil { + return false + } + defer resp.Body.Close() + logrus.Debugf("Ping %s status %d", scheme+"://"+c.registry+"/v1/_ping", resp.StatusCode) + if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusUnauthorized { + return false + } + return true + } + isV1 := pingV1("https") + if !isV1 && c.ctx != nil && c.ctx.DockerInsecureSkipTLSVerify { + isV1 = pingV1("http") + } + if isV1 { + err = ErrV1NotSupported + } else { + err = fmt.Errorf("pinging docker registry returned %+v", err) + } + } return pr, err }