How can I list all tags for a Docker image on a remote registry?

Docker

Docker Problem Overview


How can I list all tags of a Docker image on a remote Docker registry using the CLI (preferred) or curl?

Preferably without pulling all versions from the remote registry. I just want to list the tags.

Docker Solutions


Solution 1 - Docker

I got the answer from here . Thanks a lot! :)

Just one-line-script:(find all the tags of debian)

wget -q https://registry.hub.docker.com/v1/repositories/debian/tags -O -  | sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g' | tr '}' '\n'  | awk -F: '{print $3}'

UPDATE Thanks for @degelf's advice. Here is the shell script.

#!/bin/bash

if [ $# -lt 1 ]
then
cat << HELP

dockertags  --  list all tags for a Docker image on a remote registry.

EXAMPLE: 
    - list all tags for ubuntu:
       dockertags ubuntu

    - list all php tags containing apache:
       dockertags php apache

HELP
fi

image="$1"
tags=`wget -q https://registry.hub.docker.com/v1/repositories/${image}/tags -O -  | sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g' | tr '}' '\n'  | awk -F: '{print $3}'`

if [ -n "$2" ]
then
    tags=` echo "${tags}" | grep "$2" `
fi

echo "${tags}"

You can just create a new file name, dockertags, under /usr/local/bin (or add a PATH env to your .bashrc/.zshrc), and put that code in it. Then add the executable permissions(chmod +x dockertags).

Usage:

dockertags ubuntu ---> list all tags of ubuntu

dockertags php apache ---> list all php tags php containing 'apache'

Solution 2 - Docker

As of Docker Registry V2, a simple GET suffice:

GET /v2/<name>/tags/list

See docs for more.

Solution 3 - Docker

If you want to use the docker registry v2 API, it lists tags by pages. To list all the tags of an image, you may would like to add a large page_size parameter to the url, e.g.

curl -L -s 'https://registry.hub.docker.com/v2/repositories/library/centos/tags?page_size=1024'|jq '."results"[]["name"]'

Solution 4 - Docker

The Docker V2 API requires an OAuth bearer token with the appropriate claims. In my opinion, the official documentation is rather vague on the topic. So that others don't go through the same pain I did, I offer the below docker-tags function.

The most recent version of docker-tags can be found in my GitHubGist : "List Docker Image Tags using bash".

The docker-tags function has a dependency on jq. If you're playing with JSON, you likely already have it.

#!/usr/bin/env bash
docker-tags() {
    arr=("$@")

    for item in "${arr[@]}";
    do
        tokenUri="https://auth.docker.io/token"
        data=("service=registry.docker.io" "scope=repository:$item:pull")
        token="$(curl --silent --get --data-urlencode ${data[0]} --data-urlencode ${data[1]} $tokenUri | jq --raw-output '.token')"
        listUri="https://registry-1.docker.io/v2/$item/tags/list"
        authz="Authorization: Bearer $token"
        result="$(curl --silent --get -H "Accept: application/json" -H "Authorization: Bearer $token" $listUri | jq --raw-output '.')"
        echo $result
    done
}

Example

docker-tags "microsoft/nanoserver" "microsoft/dotnet" "library/mongo" "library/redis"

Admittedly, docker-tags makes several assumptions. Specifically, the OAuth request parameters are mostly hard coded. A more ambitious implementation would make an unauthenticated request to the registry and derive the OAuth parameters from the unauthenticated response.

Solution 5 - Docker

If the JSON parsing tool, jq is available

wget -q https://registry.hub.docker.com/v1/repositories/debian/tags -O - | \
    jq -r '.[].name'

Solution 6 - Docker

I've managed to get it working using curl:

curl -u <username>:<password> https://myrepo.example/v1/repositories/<username>/<image_name>/tags

Note that image_name should not contain user details etc. For example if you're pushing image named myrepo.example/username/x then image_name should be x.

Solution 7 - Docker

You can list all the tags with skopeo and jq for json parsing through cli.

skopeo --override-os linux inspect docker://httpd | jq '.RepoTags'

[  "2-alpine",  "2.2-alpine",  "2.2.29",  "2.2.31-alpine",  "2.2.31",  "2.2.32-alpine",  "2.2.32",  "2.2.34-alpine",  "2.2.34",  "2.2",  "2.4-alpine",  "2.4.10",  "2.4.12",  "2.4.16",  "2.4.17",  "2.4.18",  "2.4.20",  "2.4.23-alpine",  "2.4.23",  "2.4.25-alpine",  "2.4.25",  "2.4.27-alpine",  "2.4.27",  "2.4.28-alpine",  "2.4.28",  "2.4.29-alpine",  "2.4.29",  "2.4.32-alpine",  "2.4.32",  "2.4.33-alpine",  "2.4.33",  "2.4.34-alpine",  "2.4.34",  "2.4.35-alpine",  "2.4.35",  "2.4.37-alpine",  "2.4.37",  "2.4.38-alpine",  "2.4.38",  "2.4.39-alpine",  "2.4.39",  "2.4.41-alpine",  "2.4.41",  "2.4.43-alpine",  "2.4.43",  "2.4",  "2",  "alpine",  "latest"]

For external registries:

skopeo --override-os linux inspect --creds username:password docker://<registry-url>/<repo>/<image> | jq '.RepoTags'

Note: --override-os linux is only needed if you are not running on a linux host. For example, you'll have better results with it if you are on MacOS.

Solution 8 - Docker

Building on Yan Foto's answer (the v2 api), I created a simple Python script to list the tags for a given image.

Usage:

./docker-registry-list.py alpine

Output:

{
  "name": "library/alpine",
  "tags": [
    "2.6",
    "2.7",
    "3.1",
    "3.2",
    "3.3",
    "3.4",
    "3.5",
    "3.6",
    "3.7",
    "edge",
    "latest"
  ]
}

Solution 9 - Docker

You can achieve by running on terminal this:

curl -L -s 'https://registry.hub.docker.com/v2/repositories/library/mysql/tags/' | jq . | grep name

Also, if you don't have jq you have to install it by

sudo apt-get install jq

Solution 10 - Docker

See CLI utility: https://www.npmjs.com/package/docker-browse

Allows enumeration of tags and images.

docker-browse tags <image> will list all tags for the image. e.g. docker-browse tags library/alpine

docker-browse images will list all images in the registry. Not currently available for index.docker.io.

You may connect it to any registry, including your private one, so long as it supports Docker Registry HTTP API V2

Solution 11 - Docker

Here's a Powershell script I wrote for Windows. Handles v1 and v2 repos:

Get-DockerImageVersions.ps1:

param (
  [Parameter (Mandatory=$true)]$ImageName,
  [Parameter (Mandatory=$false)]$RegistryURL
)

if (!$RegistryURL) 
{
  $RegistryURL = "https://registry.hub.docker.com/v1/repositories"
}

$list = ""
if ($RegistryURL -like "*v2*") 
{
  $list = "/list"
}

$URL = "$RegistryURL/$ImageName/tags$list"

write-debug $URL
$resp = Invoke-WebRequest -UseBasicParsing $URL | ConvertFrom-Json

if ($RegistryURL -like "*v2*") 
{
  $tags = $resp | select tags
  $tags.tags
} else {
  $tags = $resp | select name
  $tags.name
}

Solution 12 - Docker

curl -u <username>:<password> https://$your_registry/v2/$image_name/tags/list -s -o - | \
	tr -d '{' | tr -d '}' | sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g' | \
	awk -F: '{print $3}' | sed -e 's/,/\n/g'

You can use it if your env has no 'jq', = )

Solution 13 - Docker

Get all tags from Docker Hub: this command uses the command-line JSON processor jq to select the tag names from the JSON returned by the Docker Hub Registry (the quotes are removed with tr). Replace library with the Docker Hub user name, debian with the image name:

curl -s 'https://registry.hub.docker.com/v2/repositories/library/debian/tags/' | jq -r '."results"[]["name"]'

Solution 14 - Docker

To view all available tags in a browser:

https://registry.hub.docker.com/v1/repositories/<username>/<image_name>/tags

i.e. https://hub.docker.com/r/localstack/localstack/tags

Or, you can get a json response using this endpoint:

https://registry.hub.docker.com/v1/repositories/localstack/localstack/tags

Solution 15 - Docker

You can use:

skopeo inspect docker://<REMOTE_REGISTRY> --authfile <PULL_SECRET> | jq .RepoTags

Solution 16 - Docker

You can also use this scrap :

# vim /usr/sbin/docker-tags 

& Append Following (as it is):

#!/bin/bash
im="$1"
[[ -z "$im" ]] && { echo -e '\e[31m[-]\e[39m Where is the image name ??' ; exit ; }
[[ -z "$(echo "$im"| grep -o '/')" ]] && { link="https://hub.docker.com/r/library/$im/tags/" ; } || { link="https://hub.docker.com/r/$im/tags/" ; }
resp="$(curl -sL "$link")"
err="$(echo "$resp" | grep -o 'Page Not Found')"
if [[ ! -z "$err" ]] ; then
    echo -e "\e[31m[-]\e[39m No Image Found with name => [ \e[32m$im\e[39m ]"
    exit
else
    tags="$(echo "$resp"|sed  -e 's|}|\n|g' -e 's|{|\n|g'|grep '"result"'|sed -e 's|,|\n|g'|cut -d '[' -f2|cut -d ']' -f1|sed  '/"tags":/d'|sed -e 's|"||g')"
    echo -e "\e[32m$tags\e[39m"
fi

Make it Executable :

# chmod 755 /usr/sbin/docker-tags

Then Finally Try By :

$ docker-tags testexampleidontexist
   [-] No Image Found with name => [ testexampleidontexist ]

$ docker search ubuntu

$ docker-tags teamrock/ubuntu
   latest

[ Hope you are aware of $ & # before running any command ]

Solution 17 - Docker

If folks want to read tags from the RedHat registry at https://registry.redhat.io/v2 then the steps are:

# example nodejs-12 image
IMAGE_STREAM=nodejs-12
REDHAT_REGISTRY_API="https://registry.redhat.io/v2/rhel8/$IMAGE_STREAM"
# Get an oAuth token based on a service account username and password https://access.redhat.com/articles/3560571
TOKEN=$(curl --silent -u "$REGISTRY_USER":"$REGISTRY_PASSWORD" "https://sso.redhat.com/auth/realms/rhcc/protocol/redhat-docker-v2/auth?service=docker-registry&client_id=curl&scope=repository:rhel:pull" |  jq --raw-output '.token')
# Grab the tags
wget -q --header="Accept: application/json" --header="Authorization: Bearer $TOKEN" -O - "$REDHAT_REGISTRY_API/tags/list" | jq -r '."tags"[]' 

If you want to compare what you have in your local openshift registry against what is in the upstream registry.redhat.com then here is a complete script.

Solution 18 - Docker

The Docker Registry API has an endpoint to list all tags.

Looks like Tutum has a similar endpoint, as well as a way to access via tutum-cli.

With the tutum-cli, try the following:

tutum tag list <uuid>

Solution 19 - Docker

In powershell 5.1, I have a simple list_docker_image_tags.ps1 script like this:

[CmdletBinding()]
param (
    [Parameter(Mandatory = $true)]
    [string]
    $image
)

$url = "https://registry.hub.docker.com/v1/repositories/{0}/tags" -f $image 
Invoke-WebRequest $url  | ConvertFrom-Json | Write-Output

Then I can grep for 4.7 tags like this:

./list_docker_image_tags.ps1 microsoft/dotnet-framework | ?{ $_.name -match "4.7" }

Solution 20 - Docker

Here's an answer that's applicable for v2 of the registry.

If you have jq and curl installed on your machine:

curl https://registry.hub.docker.com/v2/repositories/$REPOSITORY/tags?page_size=10000 | jq '.results[] | { name: .name, architectures: ([ (.images[] | if .variant? then .os + "/" + .architecture + .variant? else .os + "/" + .architecture end) ] | join(", ")) }'

For instance, running this command for the curlimages/curl repository yields:

{
  "name": "latest",
  "architectures": "linux/ppc64le, linux/s390x, linux/arm64, linux/386, linux/armv7, linux/amd64"
}
{
  "name": "7.78.0",
  "architectures": "linux/armv7, linux/arm64, linux/386, linux/s390x, linux/ppc64le, linux/amd64"
}
{
  "name": "7.77.0",
  "architectures": "linux/ppc64le, linux/arm64, linux/s390x, linux/armv7, linux/386, linux/amd64"
}
{
  "name": "7.76.1",
  "architectures": "linux/386, linux/arm64, linux/armv7, linux/ppc64le, linux/s390x, linux/amd64"
}
{
  "name": "7.76.0",
  "architectures": "linux/armv7, linux/386, linux/s390x, linux/amd64, linux/ppc64le, linux/arm64"
}
{
  "name": "7.75.0",
  "architectures": "linux/armv7, linux/ppc64le, linux/386, linux/amd64, linux/arm64, linux/s390x"
}
{
  "name": "7.74.0",
  "architectures": "linux/armv7, linux/386, linux/amd64, linux/ppc64le, linux/s390x, linux/arm64"
}
{
  "name": "7.73.0",
  "architectures": "linux/arm64, linux/armv7, linux/s390x, linux/ppc64le, linux/amd64, linux/386"
}
{
  "name": "7.72.0",
  "architectures": "linux/s390x, linux/amd64, linux/arm64, linux/386, linux/ppc64le, linux/armv7"
}
{
  "name": "7.71.1",
  "architectures": "linux/s390x, linux/arm64, linux/ppc64le, linux/amd64, linux/386, linux/armv7"
}
{
  "name": "7.71.0",
  "architectures": "linux/arm64, linux/ppc64le, linux/386, linux/s390x, linux/amd64, linux/armv7"
}
{
  "name": "7.70.0",
  "architectures": "linux/386, linux/arm64, linux/s390x, linux/amd64, linux/ppc64le, linux/armv7"
}
{
  "name": "7.69.1",
  "architectures": "linux/amd64"
}
{
  "name": "7.69.0",
  "architectures": "linux/amd64"
}
{
  "name": "7.68.0",
  "architectures": "linux/amd64"
}
{
  "name": "7.67.0",
  "architectures": "linux/amd64"
}
{
  "name": "7.66.0",
  "architectures": "linux/amd64"
}
{
  "name": "7.65.3",
  "architectures": "linux/amd64"
}

Solution 21 - Docker

Edit: In answer to the question:

> How can I list all tags of a Docker image on a remote Docker registry using the CLI (preferred) or curl? > > Preferably without pulling all versions from the remote registry. I just want to list the tags.

To get all the tags for an image you can use "curl" to get the specific image you want and pipe the output into "jq" to extract the information.

curl -L -s 'https://registry.hub.docker.com/v2/repositories/library/python/tags?page_size=1024'|jq  '.results[]["name"]'    

Output (truncated not the full list):

"3.9-windowsservercore"  
"alpine3.14"  
"alpine3.13"  
"alpine"  
"3.9.8-alpine3.14"  
"3.9.8-alpine3.13"
"3.9.8-alpine"

Further should you need additional information from the registry you can access additional field information like this.

This command will give you both the tags and the size of the image which might be useful to have too.

curl -L -s 'https://registry.hub.docker.com/v2/repositories/library/python/tags?page_size=1024'|jq  '.results[] as $results | ($results["name"] + " - " + ($results["full_size"] | tostring))'

Output (truncated not the full list):

 "3.9-windowsservercore - 2241040278"  
 "alpine3.14 - 17565702"  
 "alpine3.13 - 17556181"  
 "alpine - 17565702"  
 "3.9.8-alpine3.14 -17362557"  
 "3.9.8-alpine3.13 - 17353629"  
 "3.9.8-alpine - 17362557"  

Solution 22 - Docker

I have done this thing when I have to implement a task in which if user somehow type the wrong tag then we have to give the list of all the tag present in the repo(Docker repo) present in the register. So I have code in batch Script.

<html>
<pre style="background-color:#bcbbbb;">
@echo off

docker login --username=xxxx --password=xxxx
docker pull %1:%2

IF NOT %ERRORLEVEL%==0 (
echo "Specified Version is Not Found "
echo "Available Version for this image is :"
for /f %%i in (' curl -s -H "Content-Type:application/json" -X POST -d "{\"username\":\"user\",\"password\":\"password\"}" https://hub.docker.com/v2/users/login ^|jq -r .token ') do set TOKEN=%%i
curl -sH "Authorization: JWT %TOKEN%" "https://hub.docker.com/v2/repositories/%1/tags/" | jq .results[].name
)
</pre>
</html>

So in this we can give arguments to out batch file like:

Dockerfile java version7 

Solution 23 - Docker

Building on @AlexForbes's answer I've improved the api v2 docker-registry-list.py to support:
  – slashes in the repository name (eg curlimages/curl) and
  – private repos (authentication by username and password)

https://github.com/axil/docker-registry-list

Usage:

./docker-registry-list.py -u dockerid -p password dockerid/myrepo

Output:

{
  "name": "dockerid/myrepo",
  "tags": [
    "1.0"
  ]
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJohanView Question on Stackoverflow
Solution 1 - DockerVi.CiView Answer on Stackoverflow
Solution 2 - DockerYan FotoView Answer on Stackoverflow
Solution 3 - Docker0xCCView Answer on Stackoverflow
Solution 4 - DockerRobV8RView Answer on Stackoverflow
Solution 5 - DockersigjuiceView Answer on Stackoverflow
Solution 6 - DockerJohanView Answer on Stackoverflow
Solution 7 - DockerBuvanesh KumarView Answer on Stackoverflow
Solution 8 - DockerAlex ForbesView Answer on Stackoverflow
Solution 9 - DockerelopezpView Answer on Stackoverflow
Solution 10 - DockerAlex CourtisView Answer on Stackoverflow
Solution 11 - DockerSteve WView Answer on Stackoverflow
Solution 12 - DockerSwenChanView Answer on Stackoverflow
Solution 13 - DockerjamleeView Answer on Stackoverflow
Solution 14 - DockerthedanottoView Answer on Stackoverflow
Solution 15 - DockerAviel YosefView Answer on Stackoverflow
Solution 16 - DockerMr. PundirView Answer on Stackoverflow
Solution 17 - Dockersimbo1905View Answer on Stackoverflow
Solution 18 - DockerAlexView Answer on Stackoverflow
Solution 19 - DockerandreavView Answer on Stackoverflow
Solution 20 - DockerCarlos NunezView Answer on Stackoverflow
Solution 21 - DockerwhojrView Answer on Stackoverflow
Solution 22 - DockerVatsal GargView Answer on Stackoverflow
Solution 23 - DockeraxilView Answer on Stackoverflow