NextDoorHacker

May 9, 2016 - 2 minute read

Getting sorted list of images from Amazon ECR

I recently switched from using own hosted Docker Registry to the amazon hosted Elastic Container Registry and found that the UI, well, sucks. The results aren’t returned in any kind of sorted order and the UI doesn’t help you do that. In addition, it’s the same issue with the cli tool. I wish they included a timestamp field to know when the layer/image was created but in absence of that, the image tag are the best we have to go with.

package aws

import (
	"fmt"
	"sort"
	"strings"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/ecr"
)

type SortImageIds []*ecr.ImageIdentifier

func (c SortImageIds) Len() int      { return len(c) }
func (c SortImageIds) Swap(i, j int) { c[i], c[j] = c[j], c[i] }
func (c SortImageIds) Less(i, j int) bool {

	//fmt.Println(*c[i].ImageTag, *c[j].ImageTag)
	if c[i].ImageTag == nil {
		return true
	}
	if c[j].ImageTag == nil {
		return false
	}
	return strings.Compare(*c[i].ImageTag, *c[j].ImageTag) == -1
}

func GetSortedImageIds(region string, registryId string, repositoryName string) []*ecr.ImageIdentifier {

	ecrSvc := ecr.New(session.New(), &aws.Config{Region: aws.String(region)})

	done := false
	var imageIds []*ecr.ImageIdentifier
	params := &ecr.ListImagesInput{
		RepositoryName: aws.String(repositoryName),
		MaxResults:     aws.Int64(100),
		RegistryId:     aws.String(registryId),
	}
	for !done {
		resp, err := ecrSvc.ListImages(params)

		if err != nil {
			// Print the error, cast err to awserr.Error to get the Code and
			// Message from an error.
			fmt.Println(err.Error())
			return nil
		}

		//fmt.Println(resp)
		for _, imageID := range resp.ImageIds {
			imageIds = append(imageIds, imageID)
		}
		if resp.NextToken == nil {
			done = true
		} else {
			params.NextToken = resp.NextToken
		}
	}
	sort.Sort(SortImageIds(imageIds))

	return imageIds

}

This is a very simple implementation – some details have been removed. You’re expected to have your AWS environment variables already setup. If the CLI tool is working for you, you should be fine.

Now you can call this function using

imageIds := awsapi.GetSortedImageIds("us-east-1", "<account Id>", "<repo name>")
fmt.Println(imageIds)

and get a lexically sorted list by ImageTag.