07d2ad30e5
If the daemon is configured to use a mirror for the default (Docker Hub) registry, the endpoint did not fall back to querying the upstream if the mirror did not contain the given reference. For pull-through registry-mirrors, this was not a problem, as in that case the registry would forward the request, but for other mirrors, no fallback would happen. This was inconsistent with how "pulling" images handled this situation; when pulling images, both the mirror and upstream would be tried. This patch brings the daemon-side lookup of image-manifests on-par with the client-side lookup (the GET /distribution endpoint) as used in API 1.30 and higher. Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
51 lines
1.6 KiB
Go
51 lines
1.6 KiB
Go
package distribution
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/containerd/log"
|
|
"github.com/distribution/reference"
|
|
"github.com/docker/distribution"
|
|
"github.com/docker/docker/errdefs"
|
|
)
|
|
|
|
// GetRepositories returns a list of repositories configured for the given
|
|
// reference. Multiple repositories can be returned if the reference is for
|
|
// the default (Docker Hub) registry and a mirror is configured, but it omits
|
|
// registries that were not reachable (pinging the /v2/ endpoint failed).
|
|
//
|
|
// It returns an error if it was unable to reach any of the registries for
|
|
// the given reference, or if the provided reference is invalid.
|
|
func GetRepositories(ctx context.Context, ref reference.Named, config *ImagePullConfig) ([]distribution.Repository, error) {
|
|
repoInfo, err := config.RegistryService.ResolveRepository(ref)
|
|
if err != nil {
|
|
return nil, errdefs.InvalidParameter(err)
|
|
}
|
|
// makes sure name is not empty or `scratch`
|
|
if err := validateRepoName(repoInfo.Name); err != nil {
|
|
return nil, errdefs.InvalidParameter(err)
|
|
}
|
|
|
|
endpoints, err := config.RegistryService.LookupPullEndpoints(reference.Domain(repoInfo.Name))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var (
|
|
repositories []distribution.Repository
|
|
lastError error
|
|
)
|
|
for _, endpoint := range endpoints {
|
|
repo, err := newRepository(ctx, repoInfo, endpoint, nil, config.AuthConfig, "pull")
|
|
if err != nil {
|
|
log.G(ctx).WithFields(log.Fields{"endpoint": endpoint.URL.String(), "error": err}).Info("endpoint")
|
|
lastError = err
|
|
continue
|
|
}
|
|
repositories = append(repositories, repo)
|
|
}
|
|
if len(repositories) == 0 {
|
|
return nil, lastError
|
|
}
|
|
return repositories, nil
|
|
}
|