如何在Docker命令行上的Docker注册表中找到具有特定标记的Docker镜像?

时间:2014-06-30 00:37:08

标签: docker

我尝试找到Docker镜像的一个特定标签。我怎么能在命令行上这样做?我尽量避免全部下载并删除不需要的图像。

在官方Ubuntu版本https://registry.hub.docker.com/_/ubuntu/中,有几个标签(发布),当我在命令行上搜索时,

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

同样在命令行search https://docs.docker.com/engine/reference/commandline/search/的帮助下,不知道它是如何工作的?

是否可以在docker search命令中使用?

如果我使用原始命令通过Docker registry API进行搜索,则可以获取信息:

   $ 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"
    }
]

11 个答案:

答案 0 :(得分:33)

使用CoreOS时jq可用于解析JSON数据。

就像你以前一样,看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"

更清洁的v2 API现已上市,这就是我在示例中使用的内容。我将构建一个简单的脚本docker_remote_tags

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

启用:

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

参考:

jqhttps://stedolan.github.io/jq/ | apt-get install jq

答案 1 :(得分:12)

据我所知,CLI不允许在存储库中搜索/列出标签。

但是如果你知道你想要哪个标签,你可以通过添加冒号和图像名称来明确地提取它:docker pull ubuntu:saucy

答案 2 :(得分:8)

我不喜欢上述任何解决方案,因为A)他们需要我没有并且不想安装的外部库。 B)我没有得到所有页面。

Docker API将每个请求限制为100个项目。这将遍历每个" next" item并获取它们所有(对于Python它的7页;其他可能或多或少......取决于)

如果你真的想自己发垃圾邮件,请从最后一行删除| cut -d '-' -f 1,你就会看到一切。

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's 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;

示例输出:

$ 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's 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

如果您想要bash_profile版本:

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's 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;
}

简单地称之为:docker-tags redis

示例输出:

$ docker-tags redis
...
2
2.6
2.6.17
2.8

--trunc----

32bit
alpine
latest
nanoserver
windowsservercore

答案 3 :(得分:7)

此脚本(docker-show-repo-tags.sh)适用于任何支持curl,sed,grep和sort的支持Docker的主机。这已更新,以反映存储库标记网址已更改的事实。

public class AthleteRecords{
private String name;
private int personal;
private String discipline;

public AthleteRecords(String n, int p, String d){
    name = n;
    personal = p;
    discipline = d;
}

public void setPersonal(int p){
    personal = p;
}

public void setDiscipline(String d){
    discipline = d;
}

public String getName(){
    return name;
}

public String getPersonal(){
    return personal;
}

public String getDiscipline(){
    return discipline;
}
}

此旧版本不再有效。

#!/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

这是一个简单示例的输出:

#!/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

答案 4 :(得分:5)

我编写了一个命令行工具来简化搜索我的PyTools GitHub repo中可用的DockerHub repo标记。使用各种命令行开关很简单,但最基本的是:

./dockerhub_show_tags.py repo1 repo2

它甚至可以作为泊坞窗图像使用,并且可以使用多个回购:

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

如果要嵌入脚本,请使用-q / --quiet来获取标记,例如普通的docker命令:

./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

答案 5 :(得分:4)

v2 API似乎使用某种分页,因此它不会返回所有可用的标记。这在python(或library/python)等项目中清晰可见。即使在quickly reading the documentation之后,我也无法正确使用API​​(可能是错误的文档)。

然后我使用v1 API重写了脚本,仍然使用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

完整脚本位于:https://bitbucket.org/denilsonsa/small_scripts/src/default/docker_remote_tags.sh

我还编写了(在Python中)一个改进版本,该版本汇总了指向相同版本的标签:https://bitbucket.org/denilsonsa/small_scripts/src/default/docker_remote_tags.py

答案 6 :(得分:2)

将此功能添加到您的.zshrc文件中,或手动运行命令

#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}'
}

感谢此-> How to list all tags for a Docker image on a remote registry?

答案 7 :(得分:0)

使用Python over 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

答案 8 :(得分:0)

对于在Docker集线器上使用Oauth承载令牌的脚本,请尝试:

Listing the tags of a Docker image on a Docker hub through the HTTP API

答案 9 :(得分:0)

您可以使用Visual Studio Code为可用的docker映像和标签提供自动完成功能。但是,这要求您键入标签的首字母才能查看自动完成建议。

例如,在编写FROM ubuntu时,它会提供诸如ubuntuubuntu-debootstrapubuntu-upstart之类的自动完成建议。编写FROM ubuntu:a时,它会提供自动完成建议,例如ubuntu:artfulubuntu:artful-20170511.1

答案 10 :(得分:0)

对于现代遇到此问题的任何人,您可以使用 Skopeo 从 Docker 注册表中检索图像的标签:

$ skopeo list-tags docker://jenkins/jenkins \
| jq -r '.Tags[] | select(. | contains("lts-alpine"))' \
| sort --version-sort --reverse

lts-alpine
2.277.3-lts-alpine
2.277.2-lts-alpine
2.277.1-lts-alpine
2.263.4-lts-alpine
2.263.3-lts-alpine
2.263.2-lts-alpine
2.263.1-lts-alpine
2.249.3-lts-alpine
2.249.2-lts-alpine
2.249.1-lts-alpine
2.235.5-lts-alpine
2.235.4-lts-alpine
2.235.3-lts-alpine
2.235.2-lts-alpine
2.235.1-lts-alpine
2.222.4-lts-alpine