How to find a Docker image with a specific tag in the Docker registry on the Docker command line?

I am trying to find one specific tag for a Docker image. How can I do this on the command line? I try to avoid downloading everything and deleting unnecessary images.

In the official release of Ubuntu, https://registry.hub.docker.com/_/ubuntu/ , there are several tags (release for it), whereas when searching on the command line

user@ubuntu:~$ docker search ubuntu | grep ^ubuntu ubuntu Official Ubuntu base image 354 ubuntu-upstart Upstart is an event-based replacement for ... 7 ubuntufan/ping 0 ubuntu-debootstrap 0 

Also using search on the command line https://docs.docker.com/engine/reference/commandline/search/ , don’t know how this can work?

Is this possible in the docker search ?

If I use the raw command to search through the Docker registry API , then the information can be obtained:

  $ curl https://registry.hub.docker.com//v1/repositories/ubuntu/tags | python -mjson.tool [ { "layer": "ef83896b", "name": "latest" }, ..... { "layer": "463ff6be", "name": "raring" }, { "layer": "195eb90b", "name": "saucy" }, { "layer": "ef83896b", "name": "trusty" } ] 
+48
docker
Jun 30 '14 at 0:37
source share
10 answers

As far as I know, the CLI does not allow searching / listing tags in the repository.

But if you know which tag you want, you can output it explicitly by adding a colon and an image name: docker pull ubuntu:saucy

+11
Jun 30 '14 at 8:49
source share

When using CoreOS, jq is available for analyzing JSON data.

Just as you did before, looking at library/centos

 $ curl -s -S 'https://registry.hub.docker.com/v2/repositories/library/centos/tags/' | jq '."results"[]["name"]' |sort "6" "6.7" "centos5" "centos5.11" "centos6" "centos6.6" "centos6.7" "centos7.0.1406" "centos7.1.1503" "latest" 

A cleaner API v2 is available now, and this is what I use in the example. I have docker_remote_tags simple docker_remote_tags script:

 #!/usr/bin/bash curl -s -S "https://registry.hub.docker.com/v2/repositories/library/$@/tags/" | jq '."results"[]["name"]' |sort 

Includes:

 $ ./docker_remote_tags library/centos "6" "6.7" "centos5" "centos5.11" "centos6" "centos6.6" "centos6.7" "centos7.0.1406" "centos7.1.1503" "latest" 

Link:

jq : https://stedolan.imtqy.com/jq/ | apt-get install jq

+30
Sep 17 '15 at 3:27
source share

This script (docker-show-repo-tags.sh) should work for any host with Docker support that has curl, sed, grep and sort. This has been updated to reflect the fact that the storage tag URLs have changed.

 #!/bin/sh # # Simple script that will display Docker repository tags # using basic tools: curl, sed, grep, and sort. # # Usage: # $ docker-show-repo-tags.sh ubuntu centos for Repo in $* ; do curl -sS "https://hub.docker.com/r/library/$Repo/tags/" | \ sed -e $'s/"tags":/\\\n"tags":/g' -e $'s/\]/\\\n\]/g' | \ grep '^"tags"' | \ grep '"library"' | \ sed -e $'s/,/,\\\n/g' -e 's/,//g' -e 's/"//g' | \ grep -v 'library:' | \ sort -fu | \ sed -e "s/^/${Repo}:/" done 

This old version no longer works.

 #!/bin/sh # WARNING: This no long works! # Simple script that will display Docker repository tags. # # Usage: # $ docker-show-repo-tags.sh ubuntu centos for Repo in $* ; do curl -s -S "https://registry.hub.docker.com/v2/repositories/library/$Repo/tags/" | \ sed -e $'s/,/,\\\n/g' -e $'s/\[/\\\[\n/g' | \ grep '"name"' | \ awk -F\" '{print $4;}' | \ sort -fu | \ sed -e "s/^/${Repo}:/" done 

This is the output for a simple example:

 $ docker-show-repo-tags.sh centos | cat -n 1 centos:5 2 centos:5.11 3 centos:6 4 centos:6.10 5 centos:6.6 6 centos:6.7 7 centos:6.8 8 centos:6.9 9 centos:7.0.1406 10 centos:7.1.1503 11 centos:7.2.1511 12 centos:7.3.1611 13 centos:7.4.1708 14 centos:7.5.1804 15 centos:centos5 16 centos:centos5.11 17 centos:centos6 18 centos:centos6.10 19 centos:centos6.6 20 centos:centos6.7 21 centos:centos6.8 22 centos:centos6.9 23 centos:centos7 24 centos:centos7.0.1406 25 centos:centos7.1.1503 26 centos:centos7.2.1511 27 centos:centos7.3.1611 28 centos:centos7.4.1708 29 centos:centos7.5.1804 30 centos:latest 
+7
Dec 02 '15 at 23:13
source share

I did not like any of the solutions above, because A) they required external libraries that I did not have, and which I did not want to install. B) I did not receive all the pages.

The Docker API limits you to 100 items per request. This will loop over each β€œnext” element and get them all (for Python 7 pages; others may be more or less ... dependent)

If you really want to spam yourself, delete | cut -d '-' -f 1 | cut -d '-' -f 1 | cut -d '-' -f 1 | cut -d '-' -f 1 from the last line and you will see absolutely everything.

 url=https://registry.hub.docker.com/v2/repositories/library/redis/tags/?page_size=100 '# Initial url' ; \ ( \ while [ ! -z $url ]; do '# Keep looping until the variable url is empty' \ >&2 echo -n "." '# Every iteration of the loop prints out a single dot to show progress as it got through all the pages (this is inline dot)' ; \ content=$(curl -s $url | python -c 'import sys, json; data = json.load(sys.stdin); print(data.get("next", "") or ""); print("\n".join([x["name"] for x in data["results"]]))') '# Curl the URL and pipe the output to Python. Python will parse the JSON and print the very first line as the next URL (it will leave it blank if there are no more pages) then continue to loop over the results extracting only the name; all will be stored in a variable called content' ; \ url=$(echo "$content" | head -n 1) '# Let get the first line of content which contains the next URL for the loop to continue' ; \ echo "$content" | tail -n +2 '# Print the content without the first line (yes +2 is counter intuitive)' ; \ done; \ >&2 echo '# Finally break the line of dots' ; \ ) | cut -d '-' -f 1 | sort --version-sort | uniq; 

Sample Output:

 $ url=https://registry.hub.docker.com/v2/repositories/library/redis/tags/?page_size=100 '#initial url' ; \ > ( \ > while [ ! -z $url ]; do '#Keep looping until the variable url is empty' \ > >&2 echo -n "." '#Every iteration of the loop prints out a single dot to show progress as it got through all the pages (this is inline dot)' ; \ > content=$(curl -s $url | python -c 'import sys, json; data = json.load(sys.stdin); print(data.get("next", "") or ""); print("\n".join([x["name"] for x in data["results"]]))') '# Curl the URL and pipe the JSON to Python. Python will parse the JSON and print the very first line as the next URL (it will leave it blank if there are no more pages) then continue to loop over the results extracting only the name; all will be store in a variable called content' ; \ > url=$(echo "$content" | head -n 1) '#Let get the first line of content which contains the next URL for the loop to continue' ; \ > echo "$content" | tail -n +2 '#Print the content with out the first line (yes +2 is counter intuitive)' ; \ > done; \ > >&2 echo '#Finally break the line of dots' ; \ > ) | cut -d '-' -f 1 | sort --version-sort | uniq; ... 2 2.6 2.6.17 2.8 2.8.6 2.8.7 2.8.8 2.8.9 2.8.10 2.8.11 2.8.12 2.8.13 2.8.14 2.8.15 2.8.16 2.8.17 2.8.18 2.8.19 2.8.20 2.8.21 2.8.22 2.8.23 3 3.0 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.0.7 3.0.504 3.2 3.2.0 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.2.7 3.2.8 3.2.9 3.2.10 3.2.11 3.2.100 4 4.0 4.0.0 4.0.1 4.0.2 4.0.4 4.0.5 4.0.6 4.0.7 4.0.8 32bit alpine latest nanoserver windowsservercore 



If you want a bash_profile version:

 function docker-tags () { name=$1 # Initial URL url=https://registry.hub.docker.com/v2/repositories/library/$name/tags/?page_size=100 ( # Keep looping until the variable URL is empty while [ ! -z $url ]; do # Every iteration of the loop prints out a single dot to show progress as it got through all the pages (this is inline dot) >&2 echo -n "." # Curl the URL and pipe the output to Python. Python will parse the JSON and print the very first line as the next URL (it will leave it blank if there are no more pages) # then continue to loop over the results extracting only the name; all will be stored in a variable called content content=$(curl -s $url | python -c 'import sys, json; data = json.load(sys.stdin); print(data.get("next", "") or ""); print("\n".join([x["name"] for x in data["results"]]))') # Let get the first line of content which contains the next URL for the loop to continue url=$(echo "$content" | head -n 1) # Print the content without the first line (yes +2 is counter intuitive) echo "$content" | tail -n +2 done; # Finally break the line of dots >&2 echo ) | cut -d '-' -f 1 | sort --version-sort | uniq; } 

And just call it: docker-tags redis

Sample Output:

 $ docker-tags redis ... 2 2.6 2.6.17 2.8 --trunc---- 32bit alpine latest nanoserver windowsservercore 
+5
Feb 22 '18 at 15:36
source share

I wrote a command line tool to make it easy to find the DockerHub repository tags available in my PyTools GitHub repo . It is easy to use with various command line options, but basically:

 ./dockerhub_show_tags.py repo1 repo2 

It is even available as a docker image and can take several repositions:

 docker run harisekhon/pytools dockerhub_show_tags.py centos ubuntu DockerHub repo: centos tags: 5.11 6.6 6.7 7.0.1406 7.1.1503 centos5.11 centos6.6 centos6.7 centos7.0.1406 centos7.1.1503 repo: ubuntu tags: latest 14.04 15.10 16.04 trusty trusty-20160503.1 wily wily-20160503 xenial xenial-20160503 

If you want to embed in scripts, use -q / - quiet to get only tags, for example, regular docker commands:

 ./dockerhub_show_tags.py centos -q 5.11 6.6 6.7 7.0.1406 7.1.1503 centos5.11 centos6.6 centos6.7 centos7.0.1406 centos7.1.1503 
+4
May 25 '16 at 10:22
source share

API v2 seems to use some kind of pagination, so it does not return all available tags. This is clearly seen in projects like python (or library/python ). Even after quickly reading the documentation , I could not work correctly with the API (perhaps this is the wrong documentation).

Then I rewrote the script using v1 API and still used jq :

 #!/bin/bash repo="$1" if [[ "${repo}" != */* ]]; then repo="library/${repo}" fi url="https://registry.hub.docker.com/v1/repositories/${repo}/tags" curl -s -S "${url}" | jq '.[]["name"]' | sed 's/^"\(.*\)"$/\1/' | sort 

The full script is available at: https://bitbucket.org/denilsonsa/small_scripts/src/default/docker_remote_tags.sh

I also wrote (in Python) an improved version that combines tags pointing to the same version: https://bitbucket.org/denilsonsa/small_scripts/src/default/docker_remote_tags.py

+2
Mar 19 '16 at 1:17
source share

Add this function to your .zshrc file or execute the command manually

 #usage list-dh-tags <repo> #example: list-dh-tags node function list-dh-tags(){ wget -q https://registry.hub.docker.com/v1/repositories/$1/tags -O - | sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g' | tr '}' '\n' | awk -F: '{print $3}' } 

thanks to this β†’ How to list all tags for a Docker image in a remote registry?

+2
Jul 19 '18 at 11:05
source share

Re-implementing the previous post using Python instead of sed / awk:

 for Repo in $* ; do tags=$(curl -s -S "https://registry.hub.docker.com/v2/repositories/library/$Repo/tags/") python - <<EOF import json tags = [t['name'] for t in json.loads('''$tags''')['results']] tags.sort() for tag in tags: print "{}:{}".format('$Repo', tag) EOF done 
0
Feb 19 '16 at 12:25
source share

For a scenario that works with Oauth media tokens on a Docker hub, try this:

Listing Docker Image Tags on a Docker Hub Using the HTTP API

0
Jul 09 '16 at 2:30
source share

You can use Visual Studio Code to autocomplete available images and docker tags. However, to do this, you must enter the first letter of the tag to see suggestions for autocomplete.

For example, when writing FROM ubuntu it offers autocomplete options such as ubuntu , ubuntu-debootstrap and ubuntu-upstart ubuntu-debootstrap . When writing FROM ubuntu:a it offers autocomplete options like ubuntu:artful and ubuntu:artful-20170511.1

0
Mar 28 '19 at 10:31
source share



All Articles