See coop-cloud/organising#258 This fixes also how we read the digest of the image. I think it was wrong before. Some registries restrict reading this info and we now just default to "unknown" for that case. This also appears to bring a wave of new dependencies due to the generic handling logic of containers/... package. The abra binary is now 1mb larger. The catalogue generation is now slower unfortunately. But it is more robust. The generic logic looks in ~/.docker/config.json for log in details, so you don't have to pass those in manually on the CLI anymore. We just read those defaults. You can "docker login" to get credentials setup in that file. Since most folks won't generate the catalogue, this seems fine for now.
58 lines
1.5 KiB
Go
58 lines
1.5 KiB
Go
package client
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/containers/image/docker"
|
|
"github.com/containers/image/types"
|
|
"github.com/docker/distribution/reference"
|
|
"github.com/docker/docker/client"
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
// GetRegistryTags retrieves all tags of an image from a container registry.
|
|
func GetRegistryTags(img reference.Named) ([]string, error) {
|
|
var tags []string
|
|
|
|
ref, err := docker.ParseReference(fmt.Sprintf("//%s", img))
|
|
if err != nil {
|
|
return tags, fmt.Errorf("failed to parse image %s, saw: %s", img, err.Error())
|
|
}
|
|
|
|
ctx := context.Background()
|
|
tags, err = docker.GetRepositoryTags(ctx, &types.SystemContext{}, ref)
|
|
if err != nil {
|
|
return tags, err
|
|
}
|
|
|
|
return tags, nil
|
|
}
|
|
|
|
// GetTagDigest retrieves an image digest from a container registry.
|
|
func GetTagDigest(cl *client.Client, image reference.Named) (string, error) {
|
|
target := fmt.Sprintf("//%s", reference.Path(image))
|
|
|
|
ref, err := docker.ParseReference(target)
|
|
if err != nil {
|
|
return "", fmt.Errorf("failed to parse image %s, saw: %s", image, err.Error())
|
|
}
|
|
|
|
ctx := context.Background()
|
|
img, err := ref.NewImage(ctx, nil)
|
|
if err != nil {
|
|
logrus.Debugf("failed to query remote registry for %s, saw: %s", image, err.Error())
|
|
return "", fmt.Errorf("unable to read digest for %s", image)
|
|
}
|
|
defer img.Close()
|
|
|
|
digest := img.ConfigInfo().Digest.String()
|
|
|
|
if digest == "" {
|
|
return digest, fmt.Errorf("unable to read digest for %s", image)
|
|
}
|
|
|
|
return strings.Split(digest, ":")[1][:7], nil
|
|
}
|